关于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 字段策略内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mybatis Plus 字段为空值时执行更新方法未更新解决方案

    问题描述 系统测试过程中,同事测试出使用Mybatis Plus提供的封装方法UpdateById()时,字段从前台传入的数据为空值,但是执行方法后该字段未得到更新. 问题重现 因涉及到公司层面的模型.数据,本文都为测试模型和例子. 实体类: @Data @TableName("shop_item") public class ShopItem implements Serializable { private static final long serialVersionUID =

  • 详解MyBatis-Plus updateById方法更新不了空字符串/null解决方法

    最近遇到了Mybatis-Plus updateById(),更新某一个字段为null,却发现没有更新成功,发现有一个博客记录挺好的.转载过来,方便自己看. 一.简介 因为最近在忙项目,好久都没有更新博客,最近在项目中刚好遇到一个问题,就是在使用MyBatis-Plus updateById(xxx)的时候,居然更新不了字符串或者null,本文分享两种解决方案,具体大家可以根据自己的需求选择一种方法解决. 二.原理 在实际项目中,难免更新的时候,有可能会把已有的值更新成空字符串或者null,但是

  • 详解Mybatis-plus中更新date类型数据遇到的坑

    最近一年的项目都是在使用Mybatis-plus,感觉挺好用的,也没遇到很多问题,但是在最近项目上线之后,遇到了一些新的需要,在进行新版本开发的时候就开始遇到坑了,今天来说一下更新数据中有date类型数据的时候会出现的问题. 实体类部分字段如下: @Data @Builder @NoArgsConstructor @AllArgsConstructor public class ProductPo implements Serializable { /** * 产品主键,自增 */ privat

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

    字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" 问题描述: 当字段策略为 0 "忽略判断" 的时候,如果实体和数据库有字段是需要自动更新的,例如update_time,更新某条记录的时候自动刷新update_time,理论上我们在业务控制的时候是不需要设置update_time的,利用数据库特性就好,但是在该字段策略下,业务逻辑要更新字段(没有主动设置 update_time),这时候因为忽略判断,

  • 使用Mybatis-plus策略自动更新数据库时间失败问题解决

    引言 在mybatis项目中,我们一般会使用它的插件plus以扩充它的基本查询功能.另一方面,在阿里巴巴开发手册的规范中也提到,在数据库表创建的时候,一般会有一个create_time和update_time字段,它们的建表语句往往如下: 'create_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 'update_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE C

  • mysql自动填充时间的两种实现方式小结

    目录 mysql自动填充时间的两种方式 方法一:数据库级别 方式二:代码级别 mysql自动填充时间的两种方式 mysql建表的时候有两个列,一个是createtime.另一个是updatetime 当插入一条数据,createtime列和updatetime列由数据库获取当前时间自动创建时间 当修改一条记录时,updatetime列由数据库获取按当前时间自动更新时间 方法一:数据库级别 (工作中不允许你修改数据库),一般我们采用方法二 1.在表中新增字段 create_time, update

  • 解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    同事在学mybatis时,遇到了一个问题就是,使用char类型字段作为查询条件时一直都查不出数据,其他类型的则可以. 使用的数据库是oracle,查询条件字段类型是char(50),java代码对应的是String类型. 后来经过排查,是由于在oracle中,char类型字段,如果内容长度不够,会自动以空格方式补足长度.如字段 name char(5),若值为sgl,那么oracle会自动用空格补足长度,最终值为sgl. 一.解决方法: 方法1:先用trim()函数把值去掉两边空格再作为条件查询

  • mybatis plus generator 根据数据库自动生成实体类的实现示例

    目录 1.添加依赖 2.编写代码生成器 3.运行主程序,输入表名 1.添加依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId&g

  • mybatis自定义参数类型转换器数据库字段加密脱敏

    目录 1 问题背景 2 解决方案 2.1 使用数据库加密算法 2.2 使用mybatis的自定义参数类型转换器 3 一般web项目使用 3.1 创建自定义Java类型 3.2 自定义类的转换处理器 3.3 配置自定义类型和类型转换器 3.4 查询使用 3.5 新增修改使用 4. springboot项目使用 4.1 配置自定义类型和类型转换器 4.2 mybatis-plus的使用 1 问题背景 在数据库存储人员的信息时,有一些信息是敏感数据,如身份证号.出生地等.为了防止信息泄漏,这些信息不允

  • tk.mybatis通用插件updateByPrimaryKeySelective无法自动更新列的解决办法

    tk.mybatis是一个很好用的通用插件,把CRUD这些基本的数据操作全都用动态SQL语句自动生成了,mapper和xml里十分清爽,但是昨天发现有一个小坑,记录在此: 有一张表,结构如下(已经简化了): CREATE TABLE `t_sample` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID', `empcode` varchar(8) NOT NULL DEFAULT '' COMMENT '员工号', `datacha

  • 使用Mybatis Generator结合Ant脚本快速自动生成Model、Mapper等文件的方法

    MyBatis简介: MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 相关阅读:MyBatis入门学习教程(一)-MyBatis快速入门 使用过Mybatis的同学都知道,针对每一个项目中使用到的数据库表都需要建

  • mybatis某些字段无法映射成功的解决

    随笔记录下: 刚刚遇到一个mybatis中reultMap定义正确column与property也都正确,字段的getset方法也都有,但是返回对象时,有些字段可以对应上有一些则不可以. 找了好久才发现在sql语句中的 resultMap 写成了 resultType... 很low但是痛.改成resultMap一切正常! 补充知识:MyBatis学习总结--解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况

随机推荐