Mybatis Plus入门(二) 主键策略、自动填充、乐观锁

环境搭建

  1. 依赖
<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>
启动类:@MapperScan("com.bky.mapper")

主键策略

四种主键策略介绍

  1. 自动增长 AUTU INCERMENT

需要得到上一个表的最后id值

  1. UUID 每次生成随机唯一的值

排序不方便,但是不需要关注上一个表的最后id值

  1. redis实现
  2. mp自带策略 snowflake算法实现

参考博客:https://www.cnblogs.com/haoxinyue/p/5208136.html

代码使用@TableId(type = IdType.AUTO)

1. AUTO:自动增长
2. INPUT:自己输入id值
3. NONE:无策略,输入
4. UUID:随机唯一值
5. ID_WORKER:是mp自带策略,生成19位值,数据类型使用这个策略,比如long
5. ID_WORKER_STR :是mp自带策略,生成19位值,字符串类型使用这个策略

自动填充

  1. 数据库表中添加update_time和create_time两个字段
  2. 在实体类中添加对应的属性
  3. 在实体类,给需要自动填充的属性添加注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
  1. 创建类,实现接口MetaObjectHandler ,实现接口中的方法
@Component
public class MymetaObjectHandler implements MetaObjectHandler {
    /**
     * 使用mp实现添加操作,这个方法就执行
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {//元数据对象
         this.setFieldValByName("createTime",new Date(),metaObject);
         this.setFieldValByName("updateTime",new Date(),metaObject);
    }
    /**
     * 使用mp实现修改操作,这个方法就执行
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);

    }

乐观锁

主要解决:丢失更新(多个人同时修改一条记录,最后提交的人把之前的提交数据覆盖)

如果不考虑事务隔离性

  • 产生读问题:1. 脏读 2. 不可重复读 3. 幻读
  • 产生写问题: 丢失更新问题

乐观锁实现方式

  1. 取出记录时,获取当前的version
  2. 更新时,带上这个version
  3. 执行更新时,set version=newVersion where version=oldversion
  4. 如果version不对,就更新失败

具体mp实现

  1. 数据库中添加verison字段
  2. 实体类添加version字段,并在该字段上加上@version,并设置其默认值
  3. 配置乐观锁插件
@Configuration
@MapperScan("com.bky.mapper")
public class MpOptimisticLockConfig {
    //配置乐观锁插件
@Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}
  1. 测试
 @Test
    void testOptimisticLocker(){
        //工具id查询数据
        User user = userMapper.selectById(1383746022467039233L);
        user.setAge(102);
        userMapper.updateById(user);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值