当前位置: 首页 > news >正文

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

【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 编写。
在这里插入图片描述

虽好用,勿贪杯哦~~

在这里插入图片描述

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


http://www.mrgr.cn/news/2043.html

相关文章:

  • C语言---栈
  • UE网络架构和数据通信学习笔记
  • 企业高性能web服务器
  • 视频孪生技术在智慧水利(水务)场景中的典型应用展示
  • Java 细节特性
  • 前端工程化-05.Vue项目开发流程
  • 【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
  • 鸿蒙UIAbility组件概述(一)
  • Qt下使用QtPdfium处理PDF文档
  • 极速闪存启动:SD与SPI模式的智能初始化指南
  • 24年银行从业资格考试报名照规格要求
  • Linux执行脚本报错:-bash: ./mylife.sh: /bin/sh^M: bad interpreter: Text file busy
  • 从0到1!如何利用GPT创作高质量的儿童绘本故事?(附提示词)
  • Mysql占用CPU高的问题表现及2种解决方法
  • 自己搭建远程桌面服务器-RustDesk 极简版
  • 开源免费的表单收集系统TDuck
  • 安卓主板_MTK联发科主板定制开发|PCBA定制开发
  • GitHub的未来:在微软领导下保持独立与AI发展的平衡
  • 【ACL2024】基于长尾检索知识增强的大语言模型
  • Python基础—批量处理