• 三、MyBatis-Plus 自动填充和乐观锁


    1、更新操作

    注意:update时生成的sql自动是动态sql:UPDATE user SET age=? WHERE id=?

    //修改
    @Test
    public void testUpdate() {
        User user = new User();
        user.setId(1340868235401764865L);
        user.setName("lucymary");
        int count = userMapper.updateById(user);
        System.out.println(count);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2、自动填充

    需求描述:

    项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。

    我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作

    1.1 数据库修改

    在User表中添加datetime类型的新的字段 create_time、update_time

    1.2 实体类修改

    实体上增加字段并添加自动填充注解

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;  //create_time
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime; //update_time
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.3 实现元对象处理器接口

    注意:不要忘记添加 @Component 注解

    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
        //mp执行添加操作,这个方法执行
        @Override
        public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("createTime",new Date(),metaObject);
            this.setFieldValByName("updateTime",new Date(),metaObject);
        }
    
        //mp执行修改操作,这个方法执行
        @Override
        public void updateFill(MetaObject metaObject) {
            this.setFieldValByName("updateTime",new Date(),metaObject);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3、乐观锁

    3.1 场景

    主要适用场景: 当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新

    乐观锁实现方式:
    取出记录时,获取当前version
    更新时,带上这个version
    执行更新时, set version = newVersion where version = oldVersion
    如果version不对,就更新失败

    接下来介绍如何在Mybatis-Plus项目中,使用乐观锁:

    4、乐观锁实现流程

    4.1 修改实体类

    添加 @Version 注解

    @Version
    private Integer version;
    
    • 1
    • 2

    4.2 创建配置文件

    创建包config,创建文件MybatisPlusConfig.java

    此时可以删除主类中的 @MapperScan 扫描注解

    @Configuration
    @MapperScan("com.atguigu.demomptest.mapper")
    public class MpConfig {
        /**
         * 乐观锁插件
         */
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4.3 注册乐观锁插件

    在 MybatisPlusConfig 中注册 Bean

    /**
    * 乐观锁插件
    */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
    return new OptimisticLockerInterceptor();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    最新最全面的Spring详解(六)——Spring-Mybatis整合
    常见设计模式之单例模式
    Go分布式缓存 单机并发缓存(day2)
    【HTML】页面引用Vue3和Element-Plus
    【LeetCode-112】路径总和
    web:[极客大挑战 2019]PHP
    ffmpeg和ffplay
    事务管理 &AOP
    为了面试某大厂,熬夜肝完这份Redis笔记后,我终于“硬”了一回
    公网使用PLSQL远程连接Oracle数据库【内网穿透】
  • 原文地址:https://blog.csdn.net/qq_43102730/article/details/126338867