前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mybatis-plus实现对创建时间和更新时间的自动填充

mybatis-plus实现对创建时间和更新时间的自动填充

作者头像
一缕82年的清风
发布于 2021-12-06 02:41:53
发布于 2021-12-06 02:41:53
2.6K00
代码可运行
举报
文章被收录于专栏:lsqingfenglsqingfeng
运行总次数:0
代码可运行

我们在项目的开发当中,基本上没张表里都有创建时间和更新时间,而且我们每次在新增或修改数据的时候,也都要把这两个时间更新成当前时间,当然我们也可以在数据库层面设置更新时更新,否则就只能在代码中出现很多重复的如下代码:

xxx.setCreateTime(new Date());

xxx.setUpdateTime(new Date());

而mybatis-plus给我们提供一种方式,可以自动帮我们更新这两个字段,在写业务逻辑的时候就不用去关注类似上面这种重复的代码,一劳永逸,但是要注意的是,必须字段名称一致,就是每张表的创建时间都叫create_time ,更新时间叫update_time:好了,话不多说。给出代码:

1. 添加一个配置类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class MybatisPlusConf {
    /**
     * 自动填充功能
     */
    @Bean
    public GlobalConfig globalConfig() {
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setMetaObjectHandler(new MetaHandler());
        return globalConfig;
    }

}

2. 添加一个Handler

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;


@Component
public class MetaHandler implements MetaObjectHandler {

    /**
     * 新增数据执行
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        boolean hasSetter = metaObject.hasSetter("createTime");
        if (hasSetter) {
            this.setFieldValByName("createTime", new Date(), metaObject);
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    }

    /**
     * 更新数据执行
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        Object val = getFieldValByName("updateTime", metaObject);
        if (val == null) {
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    }

}

这里要注意:如果你的实体中日期是Date() 类型,上面 就用new Date(), 如果是LocalDateTime类型,就把new Date() 替换为 LocalDateTIme.now();

当然我们也可以使用上篇文章中提到的Mybatis拦截器,拦截instert 和 update方法: 配置如下;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.time.LocalDateTime;

import org.apache.ibatis.binding.MapperMethod.ParamMap;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.springframework.stereotype.Component;


@Component
@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
public class CreateTimeSetInterceptor implements Interceptor {

	private static final String CREATE_TIME_SETTER = "setCreateTime";
	private static final String UPDATE_TIME_SETTER = "setUpdateTime";

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
		Object parameter = invocation.getArgs()[1];

		if (ms.getSqlCommandType() == SqlCommandType.INSERT) {
			setTimeIfNeccesary(parameter, CREATE_TIME_SETTER);
			setTimeIfNeccesary(parameter, UPDATE_TIME_SETTER);
		} else if (ms.getSqlCommandType() == SqlCommandType.UPDATE) {
			setTimeIfNeccesary(parameter, UPDATE_TIME_SETTER);
		}
		return invocation.getMethod().invoke(invocation.getTarget(), invocation.getArgs());
	}

	private void setTimeIfNeccesary(Object param, String methodName) {
		Class<?> cls = param.getClass();

		if (cls == ParamMap.class) {
			@SuppressWarnings("unchecked")
			ParamMap<Object> map = (ParamMap<Object>) param;
			map.entrySet().forEach(entry -> {
				if (!entry.getKey().equals("et")) {
					setIfSetterExist(entry.getValue(), methodName);
				}
			});
		} else {
			setIfSetterExist(param, methodName);
		}
	}

	private void setIfSetterExist(Object param, String methodName) {
		Class<?> cls = param.getClass();
		try {
			Method m = null;
			try {
				m = cls.getDeclaredMethod(methodName, new Class[] { LocalDateTime.class });
				if (m != null) {
					m.setAccessible(true);
					m.invoke(param, LocalDateTime.now());
				}
			} catch (NoSuchMethodException e1) {
				m = cls.getDeclaredMethod(methodName, new Class[] { Timestamp.class });
				if (m != null) {
					m.setAccessible(true);
					m.invoke(param, new Timestamp(System.currentTimeMillis()));
				}
			}
		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
				| InvocationTargetException e) {
			e.printStackTrace();
		}
	}

}

好了关于今天的内容就介绍到这里了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
乱码,乱码
早期计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。
奋飛
2019/08/15
4.2K0
架构师必须掌握的各种编码:ASCII、ISO-8859-1、GB2312...
编码在我们日常开发过程中经常有遇到,常见的编码格式有ASCII、ISO-8859-1、GB2312、GBK、GB18030、UNICODE、UTF-8、UTF-16等,其中GB2312、GBK、GB18030、UTF-8、UTF-16都可以用来表示中文,那么哪种存储中文会比较合适呢,下面会对这几种编码一一介绍便会有结论。 为什么有编码 我们知道计算机中最小的存储单位是字节(byte),一个字节所能表示的字符数又有限,1byte=8bit,一个字节最多也只能表示255个字符,而世界上的语种又多,都有各种不
Java技术栈
2018/03/30
2.2K0
Python入门之字符编码
一、字节编码的基础知识 一、计算机基础知识 #1 我们的程序都是运行在特定的操作系统内,例如window,linux,mac等等 #2 运行应用程序,需要要操作系统发出请求,我们双击运行的时候会向操作
Jetpropelledsnake21
2018/05/03
9500
Python入门之字符编码
理清字符集和字符编码关系
计算机内部由集成电路(Integrated Circuit,IC)构成,IC的所有引脚,只有直流电压0V和5V两个状态。也就是说,IC的一个引脚,只能表示两个状态。正是由于这个原因,决定了计算机的信息只能用二进制数处理。
木可大大
2018/04/10
1.8K7
理清字符集和字符编码关系
BizTalk对Outbound/Inbound message字符编码的转换
BizTalk对Outbound/Inbound message字符编码的转换 一般的Linux/unix环境出来的报文大部分使用UTF-8,而Windows环境则大多是UTF-16(Unicode)编码方式。因此很多时候都需要转换报文的编码方式 方法一 通过BizTalk server 2006的XML Transmit pipeline TargetCharset的值进行设定将 TargetCharset 值设置为 Big-Endian-UTF 16,希望使用UTF-16(Unicode) 注意
阿新
2018/04/12
1K0
老是遇到乱码问题:它是如何产生的,又如何解决呢?
中文乱码问题在我们日常开发中司空见惯,那么乱码问题是如何产生的呢?又怎样去解决乱码问题呢?本文将结合基本概念和例子展开阐述,希望大家有收获。
捡田螺的小男孩
2020/04/15
1.1K0
老是遇到乱码问题:它是如何产生的,又如何解决呢?
Unicode 和 UTF-8 有何区别?
=============很久以前保存的,别人写的但是很明了=============
谙忆
2021/01/21
5220
字符集详解
MySQL 字符编码集中有两套 UTF-8 编码实现:utf8 和 utf8mb4。
人不走空
2024/02/20
1960
刨根究底字符编码之十——Unicode字符集的编码方式以及码点、码元
由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用两个或两个以上字节。
笨笨阿林
2021/12/24
2K0
刨根究底字符编码之十——Unicode字符集的编码方式以及码点、码元
字符与字节有什么区别呢?
1、计算机存储信息的最小单位,称之为位(bit),音译为比特,二进制的一个“0”或一个“1”叫一位。 2、计算机存储容量基本单位是字节(Byte),音译为拜特,8个二进制位组成1个字节。一般而言:一个标准英文字母占一个字节位置,一个标准汉字占二个字节位置。 3、计算机存储容量大小以字节数来度量,1024进位制:   1024B=1K(千)B   1024KB=1M(兆)B   1024MB=1G(吉)B   1024GB=1T(太)B   以下还有PB、EB、ZB、YB 、NB、DB,一般人不常使用了。 4、字符是一种符号,同以上说的存储单位不是一回事。
黑泽君
2018/10/11
14.3K0
关于字符集(彻底搞清楚一个中文占几个字节?)
冬天vs不冷
2025/01/21
2610
关于字符集(彻底搞清楚一个中文占几个字节?)
"字符"、"字符集"、"进制"、"编码"、"加密" 这都是啥?
对于大多数搞安全的来说,应该是能理解上面几个名次的,不过如果我说GBK ,Unicode, UTF-8, GB2312, ISO-xxxx, 二进制,八进制,十六进制 ASCII, BIG5, UTF-16,UTF-32,UTF-DOM,半角字符,全角字符 等等,这回你还能分清楚吗?
意大利的猫
2020/08/20
9230
Java内存管理-你真的理解Java中的数据类型吗(十)
0、Java的线程安全、单例模式、JVM内存结构等知识梳理 1、Java内存管理-程序运行过程(一) 2、Java内存管理-初始JVM和JVM启动流程(二) 3、Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三) 4、Java内存管理-掌握虚拟机类加载机制(四) 5、Java内存管理-掌握虚拟机类加载器(五) 6、Java内存管理-类加载器的核心源码和设计模式(六) 7、Java内存管理-掌握自定义类加载器的实现(七) 第一季总结:由浅入深JAVA内存管理 Core Story
用户7886150
2020/12/11
5350
【字符编码那些事】ASCII、GB2312、GBK、UTF-8编码以及Unicode字符集
我们在开发中是不是经常会遇到这样的问题,比如你在VS2019中创建了一个工程,里面有C语言程序和中文注释,有一天,根据工作需要,你要把其中的一部分C文件和H文件移植到Keil工程中,当你通过复制黏贴把相应文件移植到Keil工程中,并使用MDK打开时,却发现,你移植的文件C语言程序是正常显示的,但是中文却成了一堆乱码,并且一编译各种莫名其妙的报错。这其实就有可能是你的VS2019和Keil使用了不同的编码方式,因为大部分编码兼容ASCII编码,而C语言程序是英文字符,采用了ASCII编码,所以正常显示,而中文编码就不同了,比如内存中同样的0xB0A1,使用不同编码标准去对0xB0A1解码,得到的可能就是不同的汉字。
mindtechnist
2024/08/08
2K0
【字符编码那些事】ASCII、GB2312、GBK、UTF-8编码以及Unicode字符集
java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别
在平常工作中使用到char和byte的场景不多,但是如果项目中使用到IO流操作时,则必定会涉及到这两个类型,下面让我们一起来回顾一下这两个类型吧。
翎野君
2023/05/12
9040
java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别
字节码:ASCII编码:单字节编码,ANSI编码:多字节编码,UNICODE编码:宽字节编码
字符是人们常用的一些记号,比如”1”, “汉”, “お”,”℃”等等,包括各种语系的语言和一些符号都可以被称为字符。 字节是计算机存储数据的存储单元,是一个8位的二进制数,所以最多只能表示256个数字(0-255)。 编码是大家对计算机如何使用字节来表示一个字符的约定,可分为ASCII编码,ANSI编码(本地化编码),UNICODE编码(国际化编码)三种。 1.ASCII编码:单字节编码。 最初的编码,由一个字节组成,因此只能表示256个字符,但只表示0-9,a-z,A-Z,和一些加减乘除百分号,够老美用了
学到老
2018/03/19
3.5K0
字节码:ASCII编码:单字节编码,ANSI编码:多字节编码,UNICODE编码:宽字节编码
什么是字符集?
无论是数据库,还是应用服务器,有时会碰见字符集的问题,就有些懵圈。看见CSDN转载了程序员乔戈里的一篇文章,用漫画的形式,讲解了各种字符集的知识,通俗易懂。
bisal
2019/06/19
1.3K0
什么是字符集?
精述字符编码
带你了解ASCII,Latin1,ANSI,Unicode,UCS-2,UCS-4,UTF-8,UTF-16,UTF-32,GB2312,GB13000,GBK,GB18030,BIG5,BMP,Code Page,BOM,MBCS,Little Endian,Big Endian,内码,外码。
恋喵大鲤鱼
2018/08/03
1.6K0
精述字符编码
Java - 字符编码
字符集是一系列字符的集合,将每个收录的字符和数字进行映射。最早的字符集是ASCII,使用一个字节进行存储字符,8位一共可以表示256个字符,而ASCII只使用了其中的128位,即0~127位,这128位里面包括了常用的英文字符以及标点符号。
雨临Lewis
2022/02/14
1.9K0
utf8在mysql占几个字符_utf-8的中文,一个字符占几个字节「建议收藏」
https://blog.csdn.net/kindsuper_liu/article/details/80202150
全栈程序员站长
2022/09/07
7480
推荐阅读
相关推荐
乱码,乱码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档