1.入门案例与简介
MybatisPlus
是基于MyBatis
框架基础上开发的增强型工具,旨在简化开发、提供效率未使用
MybatisPlus
时,在dao
接口中的代码如下:@Mapper public interface UserDao { @Select("select * from user where id=#{id}") public User getById(Long id); }
使用
MybatisPlus
后,代码如下(依旧可以和MyBatis
一样写SQL):@Mapper public interface UserDao extends BaseMapper<User> { }
注意:
dao
接口要想被容器扫描到,有两种解决方案:
- 在
dao
接口上添加@Mapper
注解,并且确保dao
处在引导类所在包或其子包中(缺点是需要在每个dao
接口中添加注解)- 在引导类上添加
@MapperScan
注解,指定包下的所有dao
接口都能被扫描到代码参考MybatisPlus_01_quickstart
2.标准数据层开发
代码参考MybatisPlus_01_quickstart中的Mybatisplus01QuickstartApplicationTests.java
注意:
- 使用分页的前需要先配置拦截器,具体代码见MpConfig.java
3.DQL编程控制
MyBatisPlus
将书写复杂的SQL
查询条件进行了封装,使用编程的形式完成查询条件的组合。在查询所有和分页查询的时候,都有看到Wrapper
类,该类就是用来构建查询条件的代码参考MybatisPlus_02_dql中的Mybatisplus02DqlApplicationTests.java
条件查询
- 三种使用方式
- 并且与或者关系
null
判定
查询投影
- 查询指定字段
- 聚合和分组查询
查询条件
- 等值查询
- 范围查询
- 模糊查询
- 排序查询
映射匹配兼容性
- 当表的列名和模型类的属性名不一致,会导致数据封装不到模型对象,
MyBatisPlus
提供了注解@TableField
,使用该注解可以实现模型类属性名和表的列名之间的映射关系:public class User { @TableField(value = "pwd") // pwd是表中字段名称 private String password; ... }
- 当模型类中多了数据库表不存在的字段,会导致生成的
SQL
语句中在select
的时候查询了数据库不存在的字段,解决方案是使用@TableField
的属性exist
:public class User { // 设置该字段是否在数据库表中存在,如果设置为false则不存在,生成sql语句查询的时候,就不会再查询该字段 ... @TableField(exist = false) private Integer online; }
- 查询表中数据时,为了避免把敏感数据返回给前端,需要限制哪些字段默认不要进行查询,解决方案是使用
@TableField
的属性select
:public class User { // 该属性设置默认是否需要查询该字段的值,true(默认值)表示默认查询该字段,false表示默认不查询该字段 @TableField(value = "pwd",select = false) private String password; ... }
- 表的名称和模型类的名称不一致,导致查询失败,解决方案是使用
@TableName
来设置表与模型类之间的对应关系:@TableName("tbl_user") public class User { ... }
4.DML编程控制
代码参考MybatisPlus_03_dml中的Mybatisplus03DmlApplicationTests.java
id生成策略控制
新增成功后,主键ID是很长串的内容,更想要的是按数据库表字段进行自增长,在解决这个问题之前,先来分析下ID该如何选择哪种生成策略:
- 日志:自增(如
1,2,3,4,……
)- 购物订单:特殊规则(如
FQ23948AK3843
)- 外卖单:关联地区日期等信息(如
10 04 20200314 34 91
)- 关系表:可省略
id
在主键上添加
@TableId
即可设置主键生成策略(也可以在配置文件中设置全局配置)
多记录操作
使用
deleteBatchIds
和selectBatchIds
方法
逻辑删除
对于删除操作业务问题有两种方式:
- 物理删除:业务数据从数据库中丢弃,执行的是
delete
操作- 逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中,执行的是
update
操作
MyBatisPlus
进行逻辑删除的步骤如下:
- 数据库表添加
deleted
列- 实体类添加属性:
public class User { ... // 逻辑删除字段,标记当前记录是否被删除 // value为正常数据的值,delval为删除数据的值 @TableLogic(value = "0" ,delval = "1") private Integer deleted; }
- 运行删除方法:
// 底层运行的是update tbl_user set deleted=1 where id=? and deleted=0 void testDelete(){ userDao.deleteById(1L); } // 如果运行查询操作,底层运行的是select * from tbl_user where deleted=0(即也会自动添加一个未被删除的条件)
注意:
- 如果要查询所有数据(包括逻辑删的数据),需要自己在
dao
层中写SQL
语句- 如果每个表都要有逻辑删除字段,可以在配置文件中设置全局配置
乐观锁
MyBatisPlus
实现乐观锁的步骤如下:
- 数据库表添加列(如
version
)- 在模型类中添加对应的属性:
public class User { ... @Version private Integer version; }
- 添加乐观锁的拦截器:具体见MpConfig.java
- 执行更新操作
参考
https://www.bilibili.com/video/BV1Fi4y1S7ix?p=105-118