版本:3.4.1
mybatis-plus的yml常用配置
1 | mybatis-plus: |
crud操作
插入操作
1 | @SpringBootTest |
插入时的主键策略
MP 支持多种主键策略 默认是推特的“雪花算法“ ,也可以设置其他策略。
IdType
值 | 描述 |
---|---|
AUTO | 数据库ID自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT),默认根据雪花算法生成 |
INPUT | insert前自行set主键值 |
ASSIGN_ID | 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator 的方法nextId (默认实现类为DefaultIdentifierGenerator 雪花算法) |
ASSIGN_UUID | 分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator 的方法nextUUID (默认default方法) |
相关资料:分布式系统唯一ID生成方案汇总:https://www.cnblogs.com/haoxinyue/p/5208136.html
要想影响所有实体的配置,可以设置全局主键配置
1 | #全局设置主键生成策略 |
更新操作
根据Id更新操作
注意:update时生成的sql自动是动态sql:UPDATE user SET age=? WHERE id=?
1 | @Test |
自动填充
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:
首先在实体上添加注解@TableField(fill = FieldFill.INSERT)
,然后实现元对象处理器接口,不要在类上忘记添加 @Component 注解。
1 |
|
FieldFill类的一些属性:
1 | /** |
乐观锁
OptimisticLockerInnerInterceptor
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
首先数据库表要加version字段,然后字段上加上@Version
注解,然后元对象处理器接口添加version的insert默认值。
1 |
|
说明:
- 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
- 整数类型下
newVersion = oldVersion + 1
newVersion
会回写到entity
中- 仅支持
updateById(id)
与update(entity, wrapper)
方法 - 在
update(entity, wrapper)
方法下,wrapper
不能复用!!!
3.4版本后的配置写法:(如果对多个插件进行配置(本例是乐观锁和分页),要写在一个方法内)
1 | @Bean |
查询操作
通过多个id批量查询
完成了动态sql的foreach的功能
1 |
|
简单的条件查询
通过Wrapper封装查询条件
1 |
|
注意:map中的key对应的是数据库中的列名。例如数据库user_id,实体类是userId,这时map的key需要填写user_id
分页查询
MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能
(1)创建配置类
1 | /** |
(2)测试selectPage分页
测试:最终通过page对象获取相关数据
1 |
|
控制台sql语句打印:SELECT id,name,age,email,create_time,update_time FROM user LIMIT 0,5
(3)测试selectMapsPage分页:结果集是Map
1 |
|
删除操作
根据id删除记录
1 |
|
批量删除
1 |
|
逻辑删除
说明:
只对自动注入的sql起效:
插入: 不作限制
查找: 追加where条件过滤掉已删除数据,且使用 wrapper.entity 生成的where条件会忽略该字段
使用 QueryWrapper 进行查询时的sql,我们发现前面的
deleted=0
条件会让后面我们自己加的deleted条件失效SELECT * FROM test.user WHERE deleted=0 AND (deleted = ?)
更新: 追加where条件防止更新到已删除数据,且使用 wrapper.entity 生成的where条件会忽略该字段
删除: 转变为 更新
例如:
- 删除:
update user set deleted=1 where id = 1 and deleted=0
- 查找:
select id,name,deleted from user where deleted=0
字段类型支持说明:
- 支持所有数据类型(推荐使用
Integer
,Boolean
,LocalDateTime
)- 如果数据库字段使用
datetime
,逻辑未删除值和已删除值支持配置为字符串null
,另一个值支持配置为函数来获取值如now()
附录:
- 如果要恢复删除的数据,可以使用mybatis手写sql来实现,绕过mybatis-plus
- 逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
- 如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。
数据库中添加 deleted字段
1 | ALTER TABLE `user` ADD COLUMN `deleted` boolean |
实体类添加deleted 字段
并加上 @TableLogic 注解 和 @TableField(fill = FieldFill.INSERT) 注解
1 | @TableLogic |
元对象处理器接口添加deleted的insert默认值
1 | @Override |
application.properties 加入配置
此为默认值,如果你的默认值和mp默认的一样,该配置可无
1 | mybatis-plus: |
在 MybatisPlusConfig 中注册 Bean
1 | @Bean |
性能分析
该功能依赖
p6spy
组件,完美的输出打印 SQL 及执行时长3.1.0
以上版本
- p6spy 依赖引入
Maven:
1 | <dependency> |
- application.yml 配置:
1 | spring: |
- spy.properties 配置:
1 | #3.2.1以上使用 |
注意!
- driver-class-name 为 p6spy 提供的驱动类
- url 前缀为 jdbc:p6spy 跟着冒号为对应数据库连接地址
- 打印出sql为null,在excludecategories增加commit
- 批量操作不打印sql,去除excludecategories中的batch
- 批量操作打印重复的问题请使用MybatisPlusLogFactory (3.2.1新增)
- 该插件有性能损耗,不建议生产环境使用。