【Mybatis-plus】Mybatis-plus踩坑日记之速查版
- 开篇词:
- 干货篇:
- 1.@TableField(fill = FieldFill.INSERT_UPDATE)的错误使用
- 2.采用MybatisPlus自带update方法,但无法更新null的问题
- 3.表字段为json类型的入库问题
- 4.字段忽略未生效
- 5.自带id生成策略数值溢出问题
- 6.@TableLogic 对于 CIUD 的限制
- 插入(insert)
- 查找(select)
- 更新(update)
- 删除(delete)
- 总结篇:
- 我是杰叔叔,一名沪漂的码农,下期再会!
开篇词:
这期给大家分享一个关于 MyBatis-plus 的踩坑实录,这两年的血与泪的教训呀~~
干货篇:
1.@TableField(fill = FieldFill.INSERT_UPDATE)的错误使用
在进行数据插入或者更新时候,想必大家都会用到这个注解来自动刷db表的创建人,创建时间,更新人,更新时间。
然后大家都会自定义上面这个handler去处理具体刷的一些细节。
但是切记!!!
使用‘FieldFill.INSERT_UPDATE’时,如果想实现[创建人,创建时间,更新人,更新时间]同时刷db,一定要在把所有field的set语句都写在重写的insetFill方法内
2.采用MybatisPlus自带update方法,但无法更新null的问题
Mybatis-plus封装的一些方法,会进行空值的判断,如果该值为空则会不修改这个值,如何实现传的是空就改为空。
解决方法:
实体类属性的@TableField注解上加入以下属性,可以在修改时不进行null值判断
@TableField(value = "name", updateStrategy = FieldStrategy.IGNORED)
private String name;
但是这种改法会产生一个衍生问题:在做逻辑删除的时候,前端只穿一个ID但是我又不能把数据都置为空值
解决方法:
UpdateWrapper<TarchDepart> tarchDepartWrapper = new UpdateWrapper<>();
tarchDepartWrapper.eq("departId", dto.getDepartId()).set("delFlag", 1);
tarchDepartService.update(tarchDepartWrapper);
同理:实体类属性的@TableField注解加了以上属性后,在做只改一个或几个字段时的业务(如:生效,失效,逻辑删除)都可用上述方法。
3.表字段为json类型的入库问题
当数据库字段有json类型的时候,记得和表映射的entity实体中对应field添加typeHandler,如下图所示:
4.字段忽略未生效
项目中实体使用的Lombok,类中只加了@Data和@Builder注解,实体类加了忽略字段注解
@TableField(exist = false),但是未生效,查询过程报数组下标越界异常。
解决方法:
这个注解需要在实体类加上无参构造函数才能生效
5.自带id生成策略数值溢出问题
COULD NOT SET PROPERTY 'ID' OF 'CLASS COM.XXX.USER' WITH VALUE '1037678924715731598' CAUSE: JAVA.LANG.ILLEGALARGUMENTEXCEPTION: ARGUMENT TYPE MISMATCH
如果没有指定ID生成策略,mybatis-plus默认是使用自己随机的ID生成策略,会生成一个比较大的数,可能会大小溢出。
解决方法:
在实体类ID字段上加上注解 @TableId(type = IdType.AUTO),使用数据库的自增策略。
public class UserPO {
@TableId(type= IdType.AUTO)
private Long id;
}
6.@TableLogic 对于 CIUD 的限制
插入(insert)
不作限制
查找(select)
@TableLogic 注解将会在 select 语句的 where 条件添加条件,过滤掉已删除数据
且使用 wrapper.entity 生成的 where 条件会忽略该字段
SELECT user_id,name,sex,age,deleted FROM user WHERE user_id=1 AND deleted='0'
更新(update)
@TableLogic 注解将会在 update 语句的 where 条件后追加条件,防止更新到已删除数据
且使用 wrapper.entity 生成的 where条件会忽略该字段
update user set deleted=1 where id = 1 and deleted=0
删除(delete)
@TableLogic 注解会将 delete 语句转变为 update 语句
update user set deleted=1 where id = 1 and deleted=0
注意使用边界:
(1)逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
(2)如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。
总结篇:
MyBatis-Plus 是 MyBatis 的增强工具,通过提供丰富的功能和简洁的 API,极大地简化了数据库操作,提高了开发效率。它特别适合快速开发、简化 CRUD 操作等场景。
然而,对于复杂的业务逻辑和查询,可能还需要结合 MyBatis 的 XML 方式进行自定义 SQL 编写。
虽好用,勿贪杯哦~~