关于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/


猜你喜欢
- Chart控件可以用来绘制波形图、柱状图、饼图、折线图等,用来进行数据表现是很不错的,现在简单说一下这个控件的使用方法XAML:<Wi
- SqlSessionFactory的openSession方法正如其名,Sqlsession对应着一次数据库会话。由于数据库回话不是永久的,
- 今天有同事用swagger2开发时,有一方法返回Map<String,List<Object>>出现无法解析错误。P
- 有时候在单机部署,或者项目没有在IDea 开发工具中运行(idea可以自动打开tomcat项目),需要项目启动后自动打开浏览器访问项目,配置
- 1.定义Token的注解,需要Token校验的接口,方法上加上此注解import java.lang.annotation.ElementT
- 我们在使用数据库进行查询时,很多时候会用到分页展示功能,因此除了像mybatis这样的完善的orm框架之外,还有pagehelper这样的插
- 虽然Android给我们提供了众多组件,但是使用起来都不是很方便,我们开发的APK都有自己的风格,如果使用了系统自带的组件,总是觉得和应用的
- 背景:最近需要用到人脸识别,但又不花钱使用现有的第三方人脸识别接口,为此使用opencv结合java进行人脸识别(ps:opencv是开源的
- 写在前面,在笔者完成这个demo的时候,笔者发现现在大家已经不用Ajax来完成联级菜单了,实际上笔者这个demo也并不是为了完成这个,笔者主
- 本文实例为大家分享了WheelPicker自定义时间选择器控件的具体代码,供大家参考,具体内容如下先上图:使用android自带的DateP
- 我们来讨论一个经常存在的账户转账的问题。账户A要转账给账户B。为了保证在转账的过程中A和B不被其他的线程意外的操作,我们需要给A和B加锁,然
- 背景由于前前前阵子写了个壳,得去了解类的加载流程,当时记了一些潦草的笔记。这几天把这些东西简单梳理了一下,本文分析的代码基于Android8
- 本文实例为大家分享了C#实现简单的计算器功能的具体代码,供大家参考,具体内容如下环境:VS2010及以上版本1、建立个Window窗体应用2
- 简介记录一个利用系统分享功能进行图片分享的工具类(代码是用Kotlin写的,都是比较简单的语法,部分可能需要自定义的地方都已经标出)。调用方
- 首先是“饿了么”导航Tab栏悬浮的效果图。大家可以看到上图中的“分类”、“排序”、“筛选”会悬浮在app的顶部,状态随着ScrollView
- IDEA安装阿里巴巴编码规范插件的两种方式:在线安装和离线安装。1.在线安装:打开file-settings-Plugins.如图:搜索到点
- 最长公共子序列(Longest Common Subsequence)定义:两个或多个已知数列的子序列集合中最长的就是最长公共子序列。其实说
- 这篇文章主要介绍了简单了解Spring中BeanFactory与FactoryBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或
- 本人所使用的开发环境是VS2008,开发的系统所在移动终端版本为windows mobile 5.0。由于需要进行身份的验证,需要获取移动终
- mysql有个字段是bit,只存储1和0,是二进制存储,那么在java的dao层如何映射成boolean呢@Column(name=&quo