使用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 CURRENT_TIMESTAMP,

创建者则是希望在行insert的时候会自动生成create_time,同时在其它行进行修改后,执行update操作会自动更新update_time字段。

博主在开发过程中,首先采用了mybatis plus的selectOne,查询出某一个对象XXX,并对其某一值进行修改(比如状态status从0修改成1),然后想利用数据库的自动时间更新策略,即ON UPDATE CURRENT_TIMESTAMP去自动修改时间。于是用xxxService.updateById(XXX)。

但是,这样子的更新方法并不会自动更新时间。因为selectOne出来的对象是有一个明确时间了,然后update的时候就会注入这个原时间。

解决办法

方法一:

自己书写数据库字段策略,进行updateFill(),可以参考:https://www.jb51.net/article/197456.htm

这种方法的确定其博主也说了“注意这种方式只会在使用Mybatis-plus封装好的方法时才会有 效,使用自己定义的service并不会生效,这是个坑”。同时,我认为这种方法要求每个表的updateTime都是要在修改的时候改变的。有些情况下,修改个别字段可能不需要改变。在这样像切面一样,一刀切的注入感觉灵活性不够。

方法二:

自己写原生的update sql,只修改要修改的字段,不更改updateTime字段。这样子在保存的时候就会自动更新时间了。

方法三:

利用plus提供的注解,在对应的entity的字段注解@TableField中加入update = "now()",其中update = "now()"表示使用数据库时间,输出 SQL 为:update 表 set 字段=now() where ...,同时字段 update set 部分注入, 该注解优于 el 注解使用。

图1.注解书写示意图

注意:这种方法在执行updateById的时候有效,执行updateAllColumnById的时候是无效的。updateAllColumnById必须设定时间

总结

我们在生成实体的时候明确知道该表的update_time字段就是要做自动更新的,那就用方法二所述的plus下TableField注解进行更新。同时注意updateAllColumnById的情况就好。
至于方法一采用的insertFill和updateFill,这种适合全部的情况下的切面。除非在早期就明确了,如果是在中后期突然要增加的,务必确保是之前表中没有采用的字段,否则有的时候冲突了,写入的时候被串改,会导致很难查询到数据错误来源。

到此这篇关于使用Mybatis-plus策略自动更新数据库时间失败问题解决的文章就介绍到这了,更多相关Mybatis-plus自动更新数据库时间内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

  • 解决Spring Data Jpa 实体类自动创建数据库表失败问题

    目录 Spring Data Jpa 实体类自动创建数据库表失败 找了半天发现是一个配置的问题 可能导致JPA 无法自动建表的问题汇总 1.没加@Entity或引错Entity所在包 2.jpa配置中ddl-auto未设置update 3.实体类的包不是启动程序所在包的子包 4.mysql配置问题 5.依赖不全 6.实体类间关系错误 7.启动类注解问题 8.其他问题 Spring Data Jpa 实体类自动创建数据库表失败 先说一下我遇到的这个问题,首先我是通过maven创建了一个spring

  • 原生javascript实现自动更新的时间日期

    能够动态变化的事物总比静态的更能够吸引人,甚至更有实用效果,比如能够自动变化的时间日期效果就是如此,下面就通过代码实例介绍一下如何实现此效果,代码实例如下: 一.具体代码 <html> <head> <meta charset="gb2312"> <title>我们</title> <script type="text/javascript"> var t = null; function ti

  • 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

  • Jpa 实现自动更新表中的创建日期和修改时间

    一般来说创建时间和修改时间 两个字段是一个实体类必备的. 在阿里Java开发手册中也对此的说明: [强制]表必备三字段:id, create_time, update_time. 说明:其中 id 必为主键,类型为 bigint unsigned.单表时自增.步长为 1.create_time, update_time 的类型均为 datetime 类型,前者现在时表示主动式创建,后者过去分词表示被动式更新. mysql 实现添加时间自动添加更新时间自动更新 在JPA 中也是支持新的数据保存是自

  • MySQL中创建时间和更新时间的自动更新的实现示例

    目录 一.需求 二.方案 创建时间(创建日期).修改时间(修改日期)设置为自动生成 创建日期的自动生成 更新日期的自动生成 一.需求 当新增记录的时候,MySQL自动将系统的当前时间 set 到创建时间和更新时间这两个字段中.当更新记录的时候,MySQL 只 update 更新时间字段的时间,而不修改创建时间字段对应的值. 二.方案 找到表中对应的创建时间和更新时间的字段,将其修改如下: 创建时间字段creat_time timestamp NULL DEFAULT CURRENT_TIMEST

  • mysql数据库自动添加创建时间及更新时间

    目录 前言 1.描述 2 完整的操作 SQL 2.1 修改现有表中的时间列默认值为自动获取 2.2 现有表中添加时间列设置默认值 2.3 创建表时时间列设置默认值 总结 前言 志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹. 1.描述 在mysql中,添加表中的列类型为时间类型(

  • springboot+mybatis通过实体类自动生成数据库表的方法

    前言 本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表. 首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.0</ve

  • mysql 实现添加时间自动添加更新时间自动更新操作

    在数据库使用中经常使用到时间字段.常用的有创建时间和更新时间. 然而在使用中想要创建时间在创建的时候自动设置为当前时间,更新时间在更新时自动更新为当前时间. 创建表 stu CREATE TABLE `stu` ( 'id' int NOT NULL AUTO_INCREMENT, 'createTime' timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', 'moditiyTime' timestamp DEFAULT CURRENT_TIM

随机推荐