MybatisPlus字段自动填充&乐观锁的方法实现

 更新时间:2025年08月14日 09:04:27   作者:y.q.q  
MyBatis-Plus提供了便捷的自动填充功能,可用于自动处理创建时间、更新时间等字段,本文来介绍一下MybatisPlus字段自动填充&乐观锁的方法实现,感兴趣的可以了解一下

MyBatis-Plus 提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。

自动填充功能通过实现 com.baomidou.mybatisplus.core.handlers.MetaObjectHandler 接口来实现。

1.使用步骤

1.定义实体类

@TableField(fill = FieldFill.INSERT):表示该字段在执行 insert 操作时进行填充。

@TableField(fill = FieldFill.INSERT_UPDATE):表示该字段在执行 insert 和 update 操作时进行填充。

LocalDateTime:这里使用 LocalDateTime 作为时间类型,也可以使用 Date 或 Instant 等

@Data
public class User {
    private Long id;
    private String name;
    @TableField(value = "pwd",select = false)
    private String password;
    private Integer age;
    private String tel;
    @TableField(exist = false)
    private String online;
    private Integer deleted;

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

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

    private String updateUser;
}

2.编写填充处理器

创建一个类来实现 MetaObjectHandler 接口,并重写 insertFill 和 updateFill 方法。

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始插入填充...");
        // 创建时间字段只需要在创建这条记录的时候填充当前时间
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        // 更新数据的人,在插入一条记录的时候要把这个人记录到数据库
        this.strictInsertFill(metaObject, "updateUser", String.class, "admin");
        // 更新时间,在插入一条记录的时候要把当前时间记录到数据库
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("开始更新填充...");
        // 更新某条记录的时候,把该记录的更新的人记录
        // this.strictUpdateFill(metaObject, "updateUser",String.class, "zhangsan");
        // 更新时间字段,在更新一条记录的时候要把当前时间记录到数据库
        // this.strictUpdateFill(metaObject, "updateTime",LocalDateTime.class, LocalDateTime.now());
        // this.strictUpdateFill(metaObject, "updateTime",LocalDateTime.class, LocalDateTime.now());
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        this.setFieldValByName("updateUser", "zhangsan", metaObject);
    }
}

3.ID生成策略

  • id生成策略问题在实际工作中具备很强的现实意义。我们现在实验过程中数据库的id直接用 数字1、2、3来写,是非常危险的,很容易被人“拖库”,因此需要保证数据库中的数据记录 具备“无序性”。MP给我们提供了多种ID生成策略,可以在配置文件中配置这种策略。
  • “拖库” 指的是攻击者通过漏洞或非法手段获取整个数据库的完整备份(即“拖走数据库”)。如果数据库中的主键 ID 是连续的数字(如 1、2、3),攻击者可以轻松遍历所有记录,批量爬取敏感数据,甚至进一步发起注入攻击。因此,使用无序、非连续的 ID 生成策略是提升数据库安全性的重要手段。
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
    # 主键自增
      id-type: auto
      # 表前缀
      table-prefix: tbl_
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0

4.测试代码

1.testInsert():测试插入操作

  • 功能:向数据库插入一条新的用户记录。

  • 关键点

    • 使用 userMapper.insert(user) 方法,直接传入实体对象。

    • MyBatis-Plus 会自动生成主键(如配置了 @TableId 或全局主键策略)。

2.testUpdate():基于条件更新

  • 功能:根据条件更新指定字段。

  • 分析

    • 使用 UpdateWrapper 动态构建更新条件。

    • userUpdateWrapper.set("name", "更887"):直接指定更新的字段名和值。

    • userUpdateWrapper.eq("id", "1916126238607409154"):通过 eq 方法设置 WHERE 条件。

    • 调用 userMapper.update(userUpdateWrapper) 执行更新。

3.testUpdate1():基于实体主键更新

功能:先查询后更新,通过实体主键更新记录。

分析

  • 通过 userMapper.selectById("1916131310603149314") 查询用户。
  • 修改实体属性后,调用 userMapper.updateById(user) 更新。
  • MyBatis-Plus 会根据实体中的 @TableId 自动生成 WHERE 条件(如 WHERE id = ?)。
  • 支持自动填充(如 updateTime 字段)。
 @Test
    public void testInsert() {
        User user = new User();
        user.setName("张99");
        user.setAge(19);
        user.setTel("123456789");
        user.setPassword("123456");
        int insert = userMapper.insert(user);
        System.out.println("insert:"+insert);
    }
    @Test
    public void testUpdate() {
        UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
        userUpdateWrapper.set("name", "更887");
        userUpdateWrapper.eq("id", "1916126238607409154");
        userMapper.update(userUpdateWrapper);
    }
    @Test
    public void testUpdate1() {
        User user = userMapper.selectById("1916131310603149314");
        // 假设ID为1的用户存在
        user.setName("updatedUser");
        int result = userMapper.updateById(user);
        System.out.println("影响行数:" + result);
        System.out.println("更新后的用户更新时间:" + user.getUpdateTime());
    }

2.注意事项

  • 自动填充是直接给实体类的属性设置值。
  • 如果属性没有值,入库时会是 null
  • MetaObjectHandler 提供的默认方法策略是:如果属性有值则不覆盖,如果填充值为 null 则不填充。
  • 字段必须声明 @TableField 注解,并设置 fill 属性来选择填充策略。
  • 填充处理器需要在 Spring Boot 中声明为 @Component 或 @Bean
  • 使用 strictInsertFill 或 strictUpdateFill 方法可以根据注解 FieldFill.xxx、字段名和字段类型来区分填充逻辑。
  • 如果不需区分,可以使用 fillStrategy 方法。
  • 在 update(T entity, Wrapper<T> updateWrapper) 时,entity 不能为空,否则自动填充失效。
  • 在 update(Wrapper<T> updateWrapper) 时不会自动填充,需要手动赋值字段条件。

到此这篇关于MybatisPlus字段自动填充&乐观锁的方法实现的文章就介绍到这了,更多相关MybatisPlus字段自动填充&乐观锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javaCV开发详解之收流器实现

    javaCV开发详解之收流器实现

    这篇文章主要介绍了javaCV开发详解之收流器实现,对javaCV有研究的同学,可以参考下
    2021-04-04
  • SpringBoot之Banner的使用示例

    SpringBoot之Banner的使用示例

    本篇文章主要介绍了SpringBoot之Banner的使用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • springbootAOP定义切点获取/修改请求参数方式

    springbootAOP定义切点获取/修改请求参数方式

    这篇文章主要介绍了springbootAOP定义切点获取/修改请求参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • SpringBoot启动遇到的异常问题及解决方案

    SpringBoot启动遇到的异常问题及解决方案

    这篇文章主要介绍了SpringBoot启动遇到的异常问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 通过JDK源码学习InputStream详解

    通过JDK源码学习InputStream详解

    InputStream抽象类是所有字节输入流的类的超类。这篇文章主要给大家介绍了关于通过JDK源码学习InputStream的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • java 如何为文件及文件夹添加权限

    java 如何为文件及文件夹添加权限

    这篇文章主要介绍了java 如何为文件及文件夹添加权限的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring多对象引入方法

    Spring多对象引入方法

    今天小编就为大家分享一篇关于Spring多对象引入方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java代码缺陷的自动化检测与跟踪的管理指南

    Java代码缺陷的自动化检测与跟踪的管理指南

    本文系统解析Java代码缺陷类型及危害,涵盖静态分析工具检测方法,动态监控技术(异常处理、性能指标),缺陷跟踪系统与CI/CD自动化集成方案,助力提升代码质量与安全防护,需要的朋友可以参考下
    2025-07-07
  • springboot中如何通过main方法调用service或dao

    springboot中如何通过main方法调用service或dao

    这篇文章主要介绍了springboot中如何通过main方法调用service或dao,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 浅入浅出的讲解Spring循环依赖问题

    浅入浅出的讲解Spring循环依赖问题

    循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环,下面这篇文章主要给大家介绍了关于Spring循环依赖问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10

最新评论