Mybatis Plus 入門

MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發(fā)、提高效率而生。

在繼續(xù)看這篇文章之前,請確保你會 SpringBoot 以及 Mybatis,以便有更好的觀看體驗。

首先,丟出 SQL 語句:

/*
 Navicat Premium Data Transfer

 Source Server         : MySQL
 Source Server Type    : MySQL
 Source Server Version : 50623
 Source Host           : localhost:3306
 Source Schema         : mp

 Target Server Type    : MySQL
 Target Server Version : 50623
 File Encoding         : 65001

 Date: 09/12/2019 14:19:03
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint(20) NOT NULL COMMENT '主鍵',
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '年齡',
  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '郵箱',
  `manager_id` bigint(20) NULL DEFAULT NULL COMMENT '直屬上級id',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '創(chuàng)建時間',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `manager_fk`(`manager_id`) USING BTREE,
  CONSTRAINT `manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1087982257332887525, '劉明強', 31, 'lmq@baomidou.com', 1088248166370832385, '2019-12-06 02:29:20');
INSERT INTO `user` VALUES (1087982257332887553, '大boss', 40, 'boss@baomidou.com', NULL, '2019-01-11 14:20:20');
INSERT INTO `user` VALUES (1088248166370832385, '王天風', 25, 'wtf@baomidou.com', 1087982257332887553, '2019-02-05 11:12:22');
INSERT INTO `user` VALUES (1088250446457389058, '李藝偉', 28, 'lyw@baomidou.com', 1088248166370832385, '2019-02-14 08:31:16');
INSERT INTO `user` VALUES (1094590409767661570, '張雨琪', 31, 'zjq@baomidou.com', 1088248166370832385, '2019-01-14 09:15:15');
INSERT INTO `user` VALUES (1094592041087729666, '劉紅雨', 32, 'lhm@baomidou.com', 1088248166370832385, '2019-01-14 09:48:16');

SET FOREIGN_KEY_CHECKS = 1;

Mybatis Plus 快速入門

導入依賴

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
</dependency>

創(chuàng)建實體類

public class User {

    private long id;
    private String name;
    private long age;
    private String email;
    private long managerId;
    private LocalDateTime createTime;

    ......
    // get 和 set 方法、toString 方法省略
}

創(chuàng)建持久層接口

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

繼承 BaseMapper 后不需要任何操作,就可以使用了!??!

測試

@SpringBootTest
class MybatisPlusApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void selectList(){
        // 不添加任何條件查詢
        List<User> users = userMapper.selectList(null);
        for (User user1: users){
            System.out.println(user1);
        }
    }
}

查詢結果:

DEBUG==>  Preparing: SELECT id,create_time,name,manager_id,age,email FROM user 
DEBUG==> Parameters: 
TRACE<==    Columns: id, create_time, name, manager_id, age, email
TRACE<==        Row: 1087982257332887525, 2019-12-06 02:29:20, 劉明強, 1088248166370832385, 31, lmq@baomidou.com
TRACE<==        Row: 1087982257332887553, 2019-01-11 14:20:20, 大boss, null, 40, boss@baomidou.com
TRACE<==        Row: 1088248166370832385, 2019-02-05 11:12:22, 王天風, 1087982257332887553, 25, wtf@baomidou.com
TRACE<==        Row: 1088250446457389058, 2019-02-14 08:31:16, 李藝偉, 1088248166370832385, 28, lyw@baomidou.com
TRACE<==        Row: 1094590409767661570, 2019-01-14 09:15:15, 張雨琪, 1088248166370832385, 31, zjq@baomidou.com
TRACE<==        Row: 1094592041087729666, 2019-01-14 09:48:16, 劉紅雨, 1088248166370832385, 32, lhm@baomidou.com
DEBUG<==      Total: 6
User{id=1087982257332887525, name='劉明強', age=31, email='lmq@baomidou.com', managerId=1088248166370832385, createTime=2019-12-06T02:29:20}
User{id=1087982257332887553, name='大boss', age=40, email='boss@baomidou.com', managerId=0, createTime=2019-01-11T14:20:20}
User{id=1088248166370832385, name='王天風', age=25, email='wtf@baomidou.com', managerId=1087982257332887553, createTime=2019-02-05T11:12:22}
User{id=1088250446457389058, name='李藝偉', age=28, email='lyw@baomidou.com', managerId=1088248166370832385, createTime=2019-02-14T08:31:16}
User{id=1094590409767661570, name='張雨琪', age=31, email='zjq@baomidou.com', managerId=1088248166370832385, createTime=2019-01-14T09:15:15}
User{id=1094592041087729666, name='劉紅雨', age=32, email='lhm@baomidou.com', managerId=1088248166370832385, createTime=2019-01-14T09:48:16}

常用注解

  • 指定表名:@TableName
  • 指定主鍵:@TableId
  • 指定字段:@TableField

排除非表字段的方式

在實體類中,有的字段可能只用于暫時存儲數(shù)據(jù),并不需要將其插入數(shù)據(jù)庫中,可使用以下方式達到插入時排除非表字段:

  • transient

    private transient String remark;
    
  • static

    private static String remark;
    
  • @TableField

    @TableField(exist=false)
    private String remark;
    

CRUD

新增

@Test
public void insert(){
    User user = new User();
    user.setId(1087982257332117525L);
    user.setName("張三");
    user.setAge(31);
    user.setEmail("zs@baomidou.com");
    user.setManagerId(1088248166370832385L);
    user.setCreateTime(LocalDateTime.now());
    int result = userMapper.insert(user);
    System.out.println(result);
}

運行結果:

DEBUG==>  Preparing: INSERT INTO user ( id, create_time, name, manager_id, age, email ) VALUES ( ?, ?, ?, ?, ?, ? ) 
DEBUG==> Parameters: 1087982257332117525(Long), 2019-12-09T14:38:34.424022600(LocalDateTime), 張三(String), 1088248166370832385(Long), 31(Long), zs@baomidou.com(String)
DEBUG<==    Updates: 1
1

查詢

根據(jù) id 查詢

@Test
public void selectById(){
    User user = userMapper.selectById(1088248166370832385L);
    System.out.println(user);
}

查詢結果:

DEBUG==>  Preparing: SELECT id,create_time,name,manager_id,age,email FROM user WHERE id=? 
DEBUG==> Parameters: 1088248166370832385(Long)
TRACE<==    Columns: id, create_time, name, manager_id, age, email
TRACE<==        Row: 1088248166370832385, 2019-02-05 11:12:22, 王天風, 1087982257332887553, 25, wtf@baomidou.com
DEBUG<==      Total: 1
User{id=1088248166370832385, name='王天風', age=25, email='wtf@baomidou.com', managerId=1087982257332887553, createTime=2019-02-05T11:12:22}

根據(jù)多個 id 查詢

@Test
public void selectByIds() {
    List<Long> list = new ArrayList<>();
    list.add(1088248166370832385L);
    list.add(1087982257332887553L);
    List<User> users = userMapper.selectBatchIds(list);
    users.forEach(System.out::println);
}

查詢結果:

DEBUG==>  Preparing: SELECT id,create_time,name,manager_id,age,email FROM user WHERE id IN ( ? , ? ) 
DEBUG==> Parameters: 1088248166370832385(Long), 1087982257332887553(Long)
TRACE<==    Columns: id, create_time, name, manager_id, age, email
TRACE<==        Row: 1087982257332887553, 2019-01-11 14:20:20, 大boss, null, 40, boss@baomidou.com
TRACE<==        Row: 1088248166370832385, 2019-02-05 11:12:22, 王天風, 1087982257332887553, 25, wtf@baomidou.com
DEBUG<==      Total: 2
User{id=1087982257332887553, name='大boss', age=40, email='boss@baomidou.com', managerId=0, createTime=2019-01-11T14:20:20}
User{id=1088248166370832385, name='王天風', age=25, email='wtf@baomidou.com', managerId=1087982257332887553, createTime=2019-02-05T11:12:22}

根據(jù) map 查詢

@Test
public void selectByMap() {
    Map<String, Object> map = new HashMap<>();
    // key 為表中列名
    map.put("name", "王天風");
    map.put("age", 25);
    List<User> users = userMapper.selectByMap(map);
    users.forEach(System.out::println);
}

查詢結果:

DEBUG==>  Preparing: SELECT id,create_time,name,manager_id,age,email FROM user WHERE name = ? AND age = ? 
DEBUG==> Parameters: 王天風(String), 25(Integer)
TRACE<==    Columns: id, create_time, name, manager_id, age, email
TRACE<==        Row: 1088248166370832385, 2019-02-05 11:12:22, 王天風, 1087982257332887553, 25, wtf@baomidou.com
DEBUG<==      Total: 1
User{id=1088248166370832385, name='王天風', age=25, email='wtf@baomidou.com', managerId=1087982257332887553, createTime=2019-02-05T11:12:22}

條件構造器查詢

QueryWrapper<User> wrapper = new QueryWrapper<>();
// 名字中包含雨并且年齡小于 40
// name like '%雨%' and age < 40
wrapper.like("name", "雨").lt("age", 40);
// 名字中包含雨年并且齡大于等于 20 且小于等于 40 并且 email 不為空
// name like '%雨%' and age between 20 and 40 and email is not null
wrapper.like("name", "雨").between("age", 20, 40).isNotNull("email");
// 名字為王姓或者年齡大于等于 25,按照年齡降序排列,年齡相同按照 id 升序排列
// name like '王%' or age >= 25 order by age desc, id asc
wrapper.likeRight("name", "王").or().ge("age", 25).orderByDesc("age").orderByAsc("id");
// 創(chuàng)建日期為2019年2月14日并且直屬上級為名字為王姓
// date_format(create_time,'%Y-%m-%d')='2019-02-14' and manager_id in (select id from user where name like '王%')
wrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}", "2019-02-14").inSql("manager_id", "select id from user where name like '王%'");
// 名字為王姓并且年齡小于40或郵箱不為空
// name like '王%' and (age < 40 or email is not null)
wrapper.likeRight("name", "王").and(wq->wq.lt("age", 40).or().isNotNull("email"));
// 名字為王姓或者年齡小于 40 并且年齡大于 20 并且郵箱不為空
// name like '王%' or (age < 40 and age > 20 and email is not null)
wrapper.likeRight("name", "王").or(wq->wq.lt("age", 40).gt("age", 20).isNotNull("email"));
// 年齡小于40或郵箱不為空并且名字為王姓
// (age < 40 or email is not null) and name like '王%'
wrapper.nested(wq->wq.lt("age", 40).or().isNotNull("email")).like("name", "王");
// 年齡為 30、31、34、35
// age in (30, 31, 34, 35)
wrapper.in("age", Arrays.asList(30, 31, 34, 35));
// 只返回滿足條件的其中一條語句即可
// limit 1
wrapper.in("age", Arrays.asList(30, 31, 34, 35)).last("limit 1");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);

select 中字段不全出現(xiàn)的處理方法

// 第一種情況:select id,name
//             from user
//             where name like '%雨%' and age < 40
wrapper.select("id", "name").like("name", "雨").lt("age", 40);
// 第二種情況:select id,name,age,email
//             from user
//             where name like '%雨%' and age < 40
wrapper.like("name", "雨").lt("age", 40).select(
        User.class,
        info -> !info.getColumn().equals("create_time") && !info.getColumn().equals("manager_id")
);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容