当前位置: 首页 > 编程笔记 >

关于Mybatis-Plus字段策略与数据库自动更新时间的一些问题

夏炎彬
2023-03-14
本文向大家介绍关于Mybatis-Plus字段策略与数据库自动更新时间的一些问题,包括了关于Mybatis-Plus字段策略与数据库自动更新时间的一些问题的使用技巧和注意事项,需要的朋友参考一下

字段策略 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,这是一个需要注意的问题。

到此这篇关于关于Mybatis-Plus字段策略与数据库自动更新时间的一些问题的文章就介绍到这了,更多相关Mybatis-Plus 字段策略内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍mybatis升级mybatis-plus时踩到的一些坑,包括了mybatis升级mybatis-plus时踩到的一些坑的使用技巧和注意事项,需要的朋友参考一下 前言 最近使用RuoYi-Vue来做后台管理脚手架。RuoYi-Vue 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Security、MyBatis、Jwt、Vue),

  • 本文向大家介绍mybatis自动填充时间字段示例代码,包括了mybatis自动填充时间字段示例代码的使用技巧和注意事项,需要的朋友参考一下 前言 对于实体中的created_on和updated_on来说,它没有必要被开发人员去干预,因为它已经足够说明使用场景了,即在插入数据和更新数据时,记录当前时间,这对于mybatis来说,通过拦截器是可以实现的,记得之前说过在jpa中实现的方法,主要通过jp

  • 在一个类中,在一个函数中,我创建了一个Tkinter画布。这个函数正在被另一个类调用,我希望Tkinter窗口弹出30秒,然后自动关闭。我有电话 但我犯了个错误 elf.tk.call('destroy',self.w)\u tkinter.TclError:无法调用“destroy”命令:应用程序已被销毁 那我怎么能让它自己关上呢?

  • 问题内容: 我对本地数据库和基于服务的数据库有一些疑问:使用基于服务的数据库是否要求用户安装SQL Server?如果是这样,有没有解决的办法?本地数据库是否要求用户安装SQL Server?本地数据库和基于服务的数据库之间有什么区别?(我正在谈论Visual Studio中的项目) 问题答案: 客户端不需要安装SQL即可以编程方式连接到其他地方的数据库。无论哪种机制包含连接数据库的代码,通常都会