【Mybatis-plus】Mybatis-plus的踩坑日记之速查版

发布于:2024-08-22 ⋅ 阅读:(89) ⋅ 点赞:(0)

开篇词:

这期给大家分享一个关于 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 编写。
在这里插入图片描述

虽好用,勿贪杯哦~~

在这里插入图片描述

我是杰叔叔,一名沪漂的码农,下期再会!


网站公告

今日签到

点亮在社区的每一天
去签到