无事来学学--MybatisPlus运用(乐观锁)(下)

简介: MyBatis-Plus简称MP,是一个MyBatis的增强工具,在原有的基础上只做增强不做改变,为简化开发,提升效率而生


添加操作


@Test
    public void insert(){
        User user=new User();
        user.setName("niuzai");
        user.setAge(12);
        user.setEmail("231231@qq.com");
        //返回影响行数
        int i = userMapper.insert(user);
        System.out.println(i);
    }
复制代码

特别注意,在MP中主键生成的策略


雪花算法


网络异常,图片无法展示
|

网络异常,图片无法展示
|

也可以使用在实体类中的id上做注解配置主键生成策略\

@TableId(type=IdType.XXX)

例如

ASSIGN_ID 自动分配19位的id

ASSIGN_UUID

AUTO 自动增长

INPUT 自己输入


修改操作


@Test
    public void updateByID(){
        User user=new User();
        user.setId(1385515096112947202L);
        user.setName("niushi");
        int i = userMapper.updateById(user);
        System.out.println(i);
    }
复制代码


自动填充

网络异常,图片无法展示
|

为了测试,先在数据库的表中添加create_time ,update_time字段

在实体类添加对应属性,然后在属性上进行添加自动填充的属性注释

@TableField(fill = FieldFill.INSERT )
    private Date createTime;
@TableField(fill=FieldFill.INSERT_UPDATE)
    private Date updateTime;
复制代码


然后创建类,实现接口添加两个方法,重写MetaObjectHandler中的insertFill和updateFill

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //mp执行添加操作时自动填充往create_time字段中添加时间
        this.setFieldValByName("createTime",new Date(),metaObject);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        //mp执行更新和添加时都要自动填充时间,因为在user实体类中进行了相关操作
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
复制代码


乐观锁


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

乐观锁实现方式: 取出记录时,获取当前的version,更新时,带上version,执行更新时,set version= new Version where version =old version 如果版本不对,就更新失败。

补充:使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。


实现案例


  1. 首先在数据库中的字段里添加version字段
  2. 在实体类中添加version,并在其上方添加@version注释
  3. 通过version控制修改更新,进行乐观锁操作

@Version

private Integer version;

  1. 在insert时也自动填入默认版本值
@Override
    public void insertFill(MetaObject metaObject) {
        //mp执行添加操作时自动填充往create_time字段中添加时间
        this.setFieldValByName("createTime",new Date(),metaObject);
        //添加数据时默认数据版本为1
        this.setFieldValByName("version",1,metaObject);
    }
复制代码


  1. 创建配置config,注入Bean,配置乐观锁
@Configuration
@MapperScan("com.zeus.demomp.mapper")
public class MpConfig {
    //配置乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}
复制代码


  1. 进行测试,先进行查询后进行更新操作,比较version值是否更新
public void testOptimisticLocker(){
        //先通过查询
        User user = userMapper.selectById(1385609705744887809L);
        //再修改值
        user.setName("LG");
        //进行更新操作
        userMapper.updateById(user);
    }
目录
相关文章
|
4月前
|
XML 前端开发 Java
Mybatis-Plus乐观锁配置
Mybatis-Plus乐观锁配置
|
5月前
|
SQL 数据库
MyBatisPlus之逻辑删除、MyBatisPlus解决并发问题的乐观锁机制
MyBatisPlus之逻辑删除、MyBatisPlus解决并发问题的乐观锁机制
70 2
|
5月前
|
数据库
MyBatisPlus-乐观锁概念及实现步骤
MyBatisPlus-乐观锁概念及实现步骤
107 0
|
5月前
|
SQL 存储 算法
Mybatis-Plus- CRUD接口-主键策略-自动填充和乐观锁-分页-逻辑删除-条件构造器和常用接口
Mybatis-Plus- CRUD接口-主键策略-自动填充和乐观锁-分页-逻辑删除-条件构造器和常用接口
|
5月前
|
存储 Java 数据库连接
MyBatis-Plus如何娴熟运用乐观锁
MyBatis-Plus如何娴熟运用乐观锁
222 0
|
5月前
|
Java 关系型数据库 数据库连接
干翻Mybatis源码系列之第十二篇:基于Mybatis Plugins做一个乐观锁
干翻Mybatis源码系列之第十二篇:基于Mybatis Plugins做一个乐观锁
|
10月前
|
XML Java 数据库
mybatis-plus乐观锁
mybatis-plus乐观锁
61 0
|
Java
MyBatisPlus(七)乐观锁
使用乐观锁的意图是:当要更新一条记录的时候,希望这条记录没有被别人更新。那么需要在表中增加一个字段version来实现。
11870 0
|
安全 Java 数据库连接
mybatis plus整合乐观锁
mybatis plus整合乐观锁
|
数据库
MyBatisPlus的乐观锁和悲观锁
MyBatisPlus的乐观锁和悲观锁
145 0