当前位置: 代码网 > it编程>编程语言>Java > MybatisPlus字段自动填充&乐观锁的方法实现

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

2025年08月14日 Java 我要评论
mybatis-plus 提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。自动填充功能通过实现com.baomidou.mybatisplus.core.

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字段自动填充&乐观锁内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com