MybatisPlus之时间处理问题

 更新时间:2024年09月22日 10:47:42   作者:Aholic 冲冲冲  
在数据库设计时,阿里巴巴编码规约建议使用gmt_create和gmt_modified命名时间字段,并设置为datetime类型,本文介绍了两种自动填充时间字段的实现方式:SQL级别和代码级别(使用MyBatis Plus),SQL级别通过设置默认值和更新值为CURRENT_TIMESTAMP

MybatisPlus时间处理

建表

阿里巴巴编码规约中建议命名为gmt_create,gmt_modifie,并且类型datetime,我们这里用create_time create_time。

-- auto-generated definition
create table user
(
    id          bigint auto_increment comment '主键ID'
        primary key,
    name        varchar(30)                        null comment '姓名',
    age         int                                null comment '年龄',
    email       varchar(50)                        null comment '邮箱',
    create_time datetime  null comment '创建时间',
    create_time datetime  null comment '更新时间'
);

方式一:SQL级别(数据库设置)

  • create_time:

  • update_time:

官方解释:

  • 此函数返回当前数据库系统时间戳,返回值的类型为 datetime,并且不含数据库时区偏移量。
  • CURRENT_TIMESTAMP 从运行 SQL Server 实例的计算机的操作系统中获得此值

将Default Expression设置为CURRENT_TIMESTAMP的作用:

  • 在你进行插入、创建一条数据时给定一个默认值。
  • 将On Update设置为CURRENT_TIMESTAMP的作用:
  • 在你进行更新数据时会按照CURRENT_TIMESTAMP的规定更新你的值。(相当于实现了操作后时间的自动更新)

方式二:代码级别(mybatisplus自动填充)

Java中(springboot)

建一个pojo实体类:

package com.hyq.pojo;

import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT)  //插入时更新
    private Date createTime;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT_UPDATE)   //添加时更新  之后写策略
    private Date updateTime;


}

重点看时间的处理:

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT)  //插入时更新
    private Date createTime;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT_UPDATE)   //添加时更新  之后写策略
    private Date updateTime;

官方描述:

  • 描述:表名注解,标识实体类对应的表
  • 使用位置:实体类

写完@TableField后可以去配置一个handler我们这里取名为MyMetaObjectHandler;

实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler

package com.hyq.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component  //一定不要忘记把处理器加到io容器c中
public class MyMetaObjectHandler implements MetaObjectHandler {

    //插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill......");
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
    //更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start insert fill......");
        this.setFieldValByName("updateTime", new Date(), metaObject);

    }
}

这里的setFieldValByName源码如下:

    /**
     * 通用填充
     *
     * @param fieldName  java bean property name  字段名称
     * @param fieldVal   java bean property value 属性值
     * @param metaObject meta object parameter 元对象参数
     */
    default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
        if (Objects.nonNull(fieldVal) && metaObject.hasSetter(fieldName)) {
            metaObject.setValue(fieldName, fieldVal);
        }
        return this;
    }

根据自己理解判断该怎么用;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 通过实例解析spring环绕通知原理及用法

    通过实例解析spring环绕通知原理及用法

    这篇文章主要介绍了通过实例解析spring环绕通知原理及用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 一文带你彻底理解Java序列化和反序列化

    一文带你彻底理解Java序列化和反序列化

    这篇文章主要介绍了Java序列化和反序列化的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • 实例讲解Java处理PDF图章的方法

    实例讲解Java处理PDF图章的方法

    在本篇文章里小编给大家分享了关于Java处理PDF图章的方法,对此有需要的朋友们可以学习下。
    2019-02-02
  • 深入理解Java 线程池

    深入理解Java 线程池

    这篇文章主要介绍了Java 线程池的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 深入理解springMVC中的Model和Session属性

    深入理解springMVC中的Model和Session属性

    这篇文章主要介绍了深入理解springMVC中的Model和Session属性,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java父子线程之间实现共享传递数据

    java父子线程之间实现共享传递数据

    本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题
    2025-02-02
  • 使用java一维数组模拟压栈弹栈

    使用java一维数组模拟压栈弹栈

    这篇文章主要介绍了如何使用java一维数组模拟压栈弹栈,需要的朋友可以参考下
    2021-04-04
  • 深入了解Java中的Filter过滤器

    深入了解Java中的Filter过滤器

    Filter也称之为过滤器,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。下面我们来简单学习一下吧
    2019-05-05
  • SpringBoot项目中使用redis缓存的方法步骤

    SpringBoot项目中使用redis缓存的方法步骤

    本篇文章主要介绍了SpringBoot项目中使用redis缓存的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • idea中service或者mapper引入报红的问题及解决

    idea中service或者mapper引入报红的问题及解决

    在使用IntelliJ IDEA开发SpringBoot项目时,有时会遇到Service或Mapper接口引入时报红但不影响项目运行的情况,这主要是因为IDEA的检查级别设置问题,解决方法是将有问题的Error级别改为编译通过的安全级别,即可消除报红
    2024-09-09

最新评论