当前位置: 首页 > article >正文

MyBatis-Plus 自动填充:优雅实现创建/更新时间自动更新!

在这里插入图片描述

目录

    • 一、什么是 MyBatis-Plus 自动填充? 🤔
    • 二、自动填充的原理 ⚙️
    • 三、实际例子:创建时间和更新时间字段自动填充 ⏰
    • 四、注意事项 ⚠️
    • 五、总结 🎉

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

🌟了解 MyBatis-Plus 逻辑删除请看: MyBatis-Plus 逻辑删除:让数据“消失”却不真正删除的秘密!

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning

一、什么是 MyBatis-Plus 自动填充? 🤔

MyBatis-Plus 自动填充是指在执行 insertupdate 操作时,自动为某些字段设置值,而无需手动在代码中进行赋值。 这对于一些通用字段(如创建时间、更新时间、创建人、修改人等)非常有用,可以减少重复代码,提高开发效率,并保证数据的一致性。 🚀

二、自动填充的原理 ⚙️

MyBatis-Plus 通过拦截器机制,在执行 SQL 语句之前,根据配置的规则,自动为指定的字段设置值。

自动填充的实现步骤 📝

  1. 定义实体类字段: 在实体类中定义需要自动填充的字段,并使用 MyBatis-Plus 提供的注解进行标记。
  2. 编写填充处理器: 创建一个类,实现 MyBatis-Plus 提供的 MetaObjectHandler 接口,并在该类中编写填充逻辑。
  3. 配置 MyBatis-Plus: 在 MyBatis-Plus 的配置中,注册填充处理器。

三、实际例子:创建时间和更新时间字段自动填充 ⏰

假设我们有一个 User 实体类,其中包含 createTimeupdateTime 两个字段,分别表示创建时间和更新时间。

1. 定义实体类字段

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;
import java.time.LocalDateTime;

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("user")
public class User extends Model<User> {

    private static final long serialVersionUID = 1L;

    @TableId
    private Long id;

    private String name;

    private Integer age;

    private String email;

    @TableField(fill = FieldFill.INSERT) // 插入时填充字段
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE) // 插入和更新时填充字段
    private LocalDateTime updateTime;

    @Override
    protected Serializable pkVal() {
        return this.id;
    }

}

解释:

  • @TableField(fill = FieldFill.INSERT):表示该字段在执行 insert 操作时进行填充。
  • @TableField(fill = FieldFill.INSERT_UPDATE):表示该字段在执行 insertupdate 操作时进行填充。
  • LocalDateTime:这里使用 LocalDateTime 作为时间类型,也可以使用 DateInstant 等。

2. 编写填充处理器

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.time.LocalDateTime;

@Slf4j
@Component // 不要忘记加Component注解
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
    }
}

解释:

  • MyMetaObjectHandler 类实现了 MetaObjectHandler 接口。
  • insertFill 方法:在执行 insert 操作时,会调用该方法。 我们在这里为 createTimeupdateTime 字段设置当前时间。
  • updateFill 方法:在执行 update 操作时,会调用该方法。 我们在这里为 updateTime 字段设置当前时间。
  • strictInsertFillstrictUpdateFill 方法:是 MyBatis-Plus 3.3.0 版本之后推荐使用的填充方法,更加安全和严格。 它们会检查字段是否存在,类型是否匹配,以及是否已经有值,避免覆盖已有值。
  • @Component:将该类注册为 Spring Bean,以便 MyBatis-Plus 可以自动发现它。

3. 配置 MyBatis-Plus

在 Spring Boot 的配置文件(例如 application.ymlapplication.properties)中,不需要显式配置 MyBatis-Plus 的自动填充功能。 只要你的填充处理器类被 Spring 管理(例如通过 @Component 注解),MyBatis-Plus 就会自动识别并使用它。 🎉

使用示例 🚀

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsert() {
        User user = new User();
        user.setName("testUser");
        user.setAge(25);
        user.setEmail("test@example.com");

        int result = userMapper.insert(user);
        System.out.println("影响行数:" + result);
        System.out.println("插入后的用户ID:" + user.getId());
        System.out.println("插入后的用户创建时间:" + user.getCreateTime());
        System.out.println("插入后的用户更新时间:" + user.getUpdateTime());
    }

    @Test
    public void testUpdate() {
        User user = userMapper.selectById(1L); // 假设ID为1的用户存在
        user.setName("updatedUser");
        int result = userMapper.updateById(user);
        System.out.println("影响行数:" + result);
        System.out.println("更新后的用户更新时间:" + user.getUpdateTime());
    }
}

解释:

  • testInsert 方法中,我们创建了一个 User 对象,并设置了 nameageemail 字段。 createTimeupdateTime 字段没有手动设置。
  • 执行 userMapper.insert(user) 后,MyBatis-Plus 会自动调用 MyMetaObjectHandlerinsertFill 方法,为 createTimeupdateTime 字段设置当前时间。
  • testUpdate 方法中,我们先查询出一个 User 对象,然后修改了 name 字段。 updateTime 字段没有手动设置。
  • 执行 userMapper.updateById(user) 后,MyBatis-Plus 会自动调用 MyMetaObjectHandlerupdateFill 方法,为 updateTime 字段设置当前时间。

四、注意事项 ⚠️

  • 确保你的填充处理器类被 Spring 管理(例如通过 @Component 注解)。
  • 使用 strictInsertFillstrictUpdateFill 方法可以避免覆盖已有值。
  • 如果你的字段类型不是 LocalDateTime,需要根据实际类型进行调整。
  • 如果你的字段名不是 createTimeupdateTime,需要在填充处理器中修改字段名。
  • 如果你的数据库字段类型是 TIMESTAMP,建议使用 LocalDateTimeInstant 作为 Java 类型,并配置相应的类型处理器。
  • 如果你的数据库字段类型是 DATE,建议使用 LocalDate 作为 Java 类型。

五、总结 🎉

MyBatis-Plus 的自动填充功能可以极大地简化开发,提高效率,并保证数据的一致性。 通过定义实体类字段、编写填充处理器和配置 MyBatis-Plus,可以轻松实现创建时间和更新时间字段的自动填充。 希望篇文章能够帮助你理解和使用 MyBatis-Plus 的自动填充功能。 🥳


http://www.kler.cn/a/597038.html

相关文章:

  • SQL之delete、truncate和drop区别
  • JavaScript基础-DOM事件流
  • 【CSS文字渐变动画】
  • 在Mac M1/M2芯片上完美安装DeepCTR库:避坑指南与实战验证
  • OpenCV图像处理:分割、合并、打码、组合与边界填充
  • 一区思路!
  • Linux线程控制封装及线程互斥
  • MyBatis XML配置从零开始:高效处理数据库映射与查询!!!
  • C#基础学习(二)C#数组生存手册:从入门到“血压拉满“的奇妙旅程
  • 人工智能将使勒索软件更加危险
  • 【信息系统项目管理师】【论文分享】【历年真题】​论信息系统项目的成本管理
  • 数字电子技术(三十二)——组合逻辑电路的特点和基本设计方法
  • ubuntu22.04安装搜狗输入法保姆教程~
  • 考研课程安排(自用)
  • Flutter TextFormField 完全手册与设计最佳实践
  • 【MySQL报错】:Column count doesn’t match value count at row 1
  • 只是“更轻更薄”?不!遨游三防平板还选择“更强更韧”
  • 为什么 Redis 选择单线程模型?
  • 基于区块链的 Web3 数据保护技术探索
  • 现代前端开发框架对比:React、Vue 和 Svelte 的选择指南