MyBatis实现主键ID、创建时间、更新时间的自动填充

news2024/10/6 10:42:52

注意事项

一:如果插入时有设置的值就使用之前设置的值,不带时才自动赋值。

二:xml文件中必须带有需要自动赋值的字段,否则无法知道赋值(如id、create_time、update_time)
在这里插入图片描述

代码详解

注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AutoId {
    IdType type() default IdType.SNOWFLAKE;
    enum IdType{
        UUID,
        SNOWFLAKE,
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface CreateTime {
    String value() default "";
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface UpdateTime {
    String value() default "";
}

拦截器配置:

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

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        // 获取 SQL 命令
        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
        //只判断新增和修改
        if (SqlCommandType.INSERT.equals(sqlCommandType) || SqlCommandType.UPDATE.equals(sqlCommandType)) {
            // 获取参数
            Object parameter = invocation.getArgs()[1];
            //批量操作时
            if (parameter instanceof MapperMethod.ParamMap) {
                MapperMethod.ParamMap map = (MapperMethod.ParamMap) parameter;
                Object obj = map.get("list");
                List<?> list = (List<?>) obj;
                if (list != null) {
                    for (Object o : list) {
                        setParameter(o, sqlCommandType);
                    }
                }
            } else {
                setParameter(parameter, sqlCommandType);
            }
        }
        return invocation.proceed();
    }

    public void setParameter(Object parameter, SqlCommandType sqlCommandType) throws Throwable {
        Class<?> aClass = parameter.getClass();
        Field[] declaredFields;
        declaredFields = aClass.getDeclaredFields();
        for (Field field : declaredFields) {
            LocalDateTime now = LocalDateTime.now();
            if (SqlCommandType.INSERT.equals(sqlCommandType)) {
                if (field.getAnnotation(CreateTime.class) != null) {
                    field.setAccessible(true);
                    if (field.get(parameter) == null) {
                        field.set(parameter, now);
                    }
                }
                if (field.getAnnotation(UpdateTime.class) != null) {
                    field.setAccessible(true);
                    if (field.get(parameter) == null) {
                        field.set(parameter, now);
                    }
                }
                if (field.getAnnotation(AutoId.class) != null ) {
                    field.setAccessible(true);
                    if (field.get(parameter) == null) {
                        if (Objects.equals(field.getAnnotation(AutoId.class).type(), AutoId.IdType.SNOWFLAKE)) {
                            field.set(parameter, IdUtil.getSnowflakeNextId());
                        } else if (Objects.equals(field.getAnnotation(AutoId.class).type(), AutoId.IdType.UUID)) {
                            field.set(parameter, IdUtil.simpleUUID());
                        }
                    }
                }
            }
            if (SqlCommandType.UPDATE.equals(sqlCommandType)) {
                if (field.getAnnotation(UpdateTime.class) != null) {
                    field.setAccessible(true);
                    if (field.get(parameter) == null) {
                        field.set(parameter, now);
                    }
                }
            }
        }
    }
}

测试:

@Data
public class Temp implements Serializable {

    @AutoId
    private Long id;

    private String name;

    @CreateTime
    private LocalDateTime createTime;

    @UpdateTime
    private LocalDateTime updateTime;
}
@SpringBootTest
class MyBatisPlusApplicationTests {

    @Resource
    private TempMapper tempMapper;

    @Test
    void mapper() {
        Temp temp = new Temp();
        temp.setName("自动ID222");
        temp.setCreateTime(LocalDateTime.now().plusYears(11L));
        tempMapper.insert(temp);
    }
}

测试结果:
在这里插入图片描述

参考链接:
https://www.imooc.com/article/310554
http://t.csdn.cn/ZLsfK
https://hutool.cn/docs/#/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue2+echarts】树状图(标签显示不全、节点文本过长换行等问题解决)

前言 树状图的使用。官方文档 正文 关于根节点标签显示不全问题解决 一开始的series->边距设置的如下。所以根节点的标签只显示了一半多出来。 top: "1%",left: "7%",bottom: "1%",right: "20%",后面修改成 top: "1%"…

css基础知识十八:CSS如何画一个三角形?原理是什么?

一、前言 在前端开发的时候&#xff0c;我们有时候会需要用到一个三角形的形状&#xff0c;比如地址选择或者播放器里面播放按钮 通常情况下&#xff0c;我们会使用图片或者svg去完成三角形效果图&#xff0c;但如果单纯使用css如何完成一个三角形呢&#xff1f; 实现过程似乎…

Maven安装与配置以及idea配置Maven

文章目录 一、安装本地Maven 二、安装 三、配置环境变量 四、配置settings文件 五、idea配置 一、安装本地Maven 选择你需要的maven版本下载&#xff1a;官网下载传送门 我使用的是3.6.1版本&#xff1a;maven-3.6.1-bin.zip ​ 二、安装 把下载好的maven压缩包解压到…

小样本目标检测综述__刘浩宇(导航与控制2021)论文阅读

小样本目标检测综述__刘浩宇(导航与控制2021)阅读 0、引言 早期采用了大量标注样本回归候选框的位置&#xff0c;但后来目标集和训练集数据分布不同导致检测效果下降。 对于没有大量样本支持的小样本检测应用就需要使用先验知识来弥补样本的不足。 可以分为三类&#xff1a…

Redis实战——商户查询(二)

缓存穿透 缓存穿透 &#xff1a;客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这样的请求都会访问到数据库&#xff0c;这样的大量请求同时过来访问这种不存在的数据&#xff0c;这些请求就都会访问到数据库&#xff0c;对数据库造…

js:使用diff.js实现文本内容差异比较

实现效果 目录 简介安装示例1、json比较diffJson2、按行比较diffLines3、比较数组diffArrays 总结参考资料 简介 A javascript text differencing implementation. 译文&#xff1a;javascript文本差异实现。 相关文档 github https://github.com/kpdecker/jsdiffnpmjs htt…

YoloV8改进---注意力机制:高斯上下文变换器GCT,性能优于ECA、SE等注意力模块 | CVPR2021

目录 1.GCT介绍 实验结果 2.GCT引入到yolov8 2.1 修改modules.py中&#xff1a; 2.2 加入tasks.py中&#xff1a; 2.3 yolov8_GCT.yaml 3.YOLOv8魔术师专栏介绍 1.GCT介绍 论文&#xff1a;https://openaccess.thecvf.com/content/CVPR2021/papers/Ruan_Gaussian_Context_…

MySQL数据库架构

MySQL数据库架构 MySQL架构自顶向下大致可以分为连接层 , SQL层 , 存储引擎层 , 物理文件层。架构如下 连接层 -- 查看最大连接数 show variables like %max_connections%;客户端连接器&#xff0c;MySQL向外提供交互接口连接各种不同的客户端。 客户端/应用程序&#xff1a;客…

7.3.6 【Linux】磁盘/文件系统参数修订

mknod 用到的磁盘 /dev/vda 的相关设备代码如下&#xff1a; 上表当中 252 为主要设备代码 &#xff08;Major&#xff09; 而 0~5 则为次要设备代码 &#xff08;Minor&#xff09;。 我们的Linux 核心认识的设备数据就是通过这两个数值来决定的&#xff01;举例来说&#xf…

如何批量将PDF转换为图片?

在生活工作中&#xff0c;我们会处理很多电子合同。这些电子合同一般是PDF格式&#xff0c;不但存储空间大&#xff0c;且预览起来不太便捷&#xff0c;需要我们转换为图片格式更方便预览。如果人工一一处理比较繁琐复杂&#xff0c;有没有什么方案可以快速将pdf转换为图片呢&a…

如果想用unity做一个项目作为面试作品,至少该达到什么样的标准?

本文仅针对题目“如果想用unity做一个项目作为面试作品&#xff0c;至少该达到什么样的标准&#xff1f;”回答内容。 明确职业目标 首先要明确自身的职业目标&#xff0c;不同的行业、公司、游戏类型、岗位对作品的要求是不同的。 去什么样的行业&#xff1f;unity可做的有很…

python的IOError使用

try:npzfile np.load(calibrate.npz)mtx npzfile[mtx]dist npzfile[dist]except IOError:calibrate()python语言IOError错误一般多发生在对文件操作报错时&#xff0c;表示要打开的文件不存在

PostpreSQL内核学习-Chapter4 Foreign Data Wrapper(FDW)

FDW连接 preparations 两个在不同主机&#xff08;满足TCP/IP连接是分属于不同IP地址下&#xff09;&#xff08;如果是安装PG源码&#xff09;进入源码目录下面的/contrib/postgres_fdw/&#xff0c;然后用make & make install编译和安装 [rootlocalhost /]# cd 源码存…

为什么truncate函数(四舍五入)是x+0.4999997而不是+0.5?

目录 float的不精确表示 0.5的舍入方法 该方法的漏洞 0.4999997f舍入的结果错误 以0.4999997f改进舍入方法 可以用0.49999996、0.49999998或者0.49999999替换0.49999997吗&#xff1f; 在做舍入函数研究时&#xff0c;发现函数中实现四舍五入的trunc函数大概采用的逻辑是floor(…

LVS负载均衡-----DR模式

目录 1.DR模式原理 2.DR 模式的特点&#xff1a; 3.LVS-DR中的ARP问题 问题原因&#xff1a; 解决方法&#xff1a; 问题二&#xff1a;返回报文时源地址使用VIP&#xff0c;导致网关设备的ARP缓存表紊乱 解决方法&#xff1a; 4.DR模式 LVS负载均衡群集部署 1.配置负…

python进程线程问题

参考链接&#xff1a; 代码可去原博文复制&#xff1a; python缩短大量数据处理时间-进程池pool()和map() 一 定义与解释 1、对于python代码&#xff0c;多线程其实是个假的&#xff0c;因为每次计算的时候&#xff0c;实质上只有一个线程计算。使用多线程时&#xff0c;是几…

【天池题解】题解:CAAI-BDSC2023社交图谱链接预测(任务一:社交图谱小样本场景链接预测)

【天池题解】题解&#xff1a;CAAI-BDSC2023社交图谱链接预测&#xff08;任务一&#xff1a;社交图谱小样本场景链接预测&#xff09; 文章目录 【天池题解】题解&#xff1a;CAAI-BDSC2023社交图谱链接预测&#xff08;任务一&#xff1a;社交图谱小样本场景链接预测&#xf…

中介者模式的学习与使用

1、中介者模式的学习 中介者模式是一种行为型设计模式&#xff0c;它通过引入一个中介者对象来解耦一组对象之间的交互。中介者模式促进了对象之间的松耦合&#xff0c;使得它们可以独立地进行通信&#xff0c;而不需要直接相互引用。   在中介者模式中&#xff0c;有以下几个…

获取文件大小并转换单位

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【工具使用】Notepad++如何使用正则表达式同时搜索多个字符串

一&#xff0c;简介 在调试代码定位问题的时候&#xff0c;由于log打印比较多&#xff0c;故需要使用NotePad文本编辑器进行搜索&#xff0c;并且需要同时搜索多个字符串&#xff0c;本文介绍如何同时搜索多个字符串&#xff0c;供参考。 二&#xff0c;操作步骤 2.1 搜索设…