关于Mybatis-Plus字段策略与数据库自动更新时间的一些问题
作者:Fearlessroy 时间:2023-08-05 20:44:22
字段策略 0:”忽略判断”,1:”非 NULL 判断”),2:”非空判断”
问题描述:
当字段策略为 0 “忽略判断” 的时候,如果实体和数据库有字段是需要自动更新的,例如update_time,更新某条记录的时候自动刷新update_time,理论上我们在业务控制的时候是不需要设置update_time的,利用数据库特性就好,但是在该字段策略下,业务逻辑要更新字段(没有主动设置 update_time),这时候因为忽略判断,数据库(我这里是MySql)是不会去更新update_time的,即使这个字段在数据库中是这样定义的:update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE,在这种字段策略下,该字段会被设为null,具体的执行语句时insert into table(….,update_time) values(…,null)。
解决方法
实现MetaObjectHandler的insertFill()方法和updateFill()方法
@Component
public class MyMetaObjectHandler extends MetaObjectHandler {
//新增填充
@Override
public void insertFill(MetaObject metaObject){
// 获取当前时间,自动更新以下数据库字段
setFieldValByName("updateTime", new Date(), metaObject);
}
//更新填充
@Override
public void updateFill(MetaObject metaObj ct) {
// 获取当前时间,自动更新以下数据库字段
setFieldValByName("updateTime", new Date(), metaObject);
}
}
新增一个Component,继承MetaObjectHandler,重写 insertFill()和updateFill()两个方法,自定义插入和更新规 则,继承基类中的这两个方法都为空。
注意这种方式只会在使用Mybatis-plus封装好的方法时才会有 效,使用自己定义的service并不会生效,这是个坑,所以这种 方式我并不推荐。
将字段策略设为 2 “非空判断”
这时候,无论是插入还是更新语句都只会完成对已设置具体值得属性进行操作。例如:表中除了update_time以外,还有user_name字段,我们在代码中设置了这个字段的值,那么在insert的时候执行的语句是: insert into table (user_name) valuse(userName),而不会去对没有设置值得字段做任何操作,这样,有关时间的字段就可以直接交给数据库了。
字段策略为 ““非空判断”” 的一个问题
假设有个Entity User,这个Entity属性没有默认值,我们 new 一个实例,User user = new User(),然后啥也没做,调用UserService.insert(),这时候就会出现一个问题,Mybatis-plus不知道你想插入哪些值,因为没有显示setter,这是一个需要注意的问题。
来源:https://fearlessroy.net/2018/03/13/mybatis-plus/
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
android中UI主线程与子线程深入分析
Android定时器实现的几种方式整理及removeCallbacks失效问题解决
![](https://img.aspxhome.com/file/2023/9/137159_0s.gif)
C#中缓存System.Web.Caching用法总结
C#集合之有序列表的用法
Unity3d获取系统时间
Android 列表形式的切换的示例代码
![](https://img.aspxhome.com/file/2023/5/125435_0s.jpg)
SpringBoot外部化配置使用Plus版的方法示例
SpringCloud消息总线Bus配置中心实现过程解析
![](https://img.aspxhome.com/file/2023/7/64427_0s.png)
Compose 的 Navigation组件使用示例详解
详解Android Handler的使用
![](https://img.aspxhome.com/file/2023/4/137514_0s.jpg)
Java为实体类动态添加属性的方法详解
![](https://img.aspxhome.com/file/2023/1/58301_0s.png)
MyBatis Generator 自定义生成注释的方法
![](https://img.aspxhome.com/file/2023/1/64031_0s.png)
WPF实现动画效果(七)之演示图板
java实现超市管理系统
![](https://img.aspxhome.com/file/2023/4/106124_0s.jpg)
Socket结合线程池使用实现客户端和服务端通信demo
![](https://img.aspxhome.com/file/2023/5/86835_0s.jpg)
Java Excel透视表相关操作实现代码
![](https://img.aspxhome.com/file/2023/8/65218_0s.png)
C#设计模式之职责链模式示例详解
springboot省去配置Tomcat的步骤问题
![](https://img.aspxhome.com/file/2023/2/98112_0s.png)
C#逐行读取文件的方法
C++ 反汇编之关于Switch语句的优化措施
![](https://img.aspxhome.com/file/2023/5/99285_0s.png)