MyBatisPlus-03-自动填充及乐观锁

MyBatisPlus-03-自动填充及乐观锁

1. 自动填充功能

  • 创建时间、修改时间!这些个操作一遍都是自动化完成的,我们不希望手动更新!

  • 阿里巴巴开发手册:所有的数据库表:gmt_create、gmt_modified几乎所有的表都要配置上!而且需要自动化!

1.1 方式一 : 数据库级别

1、在表中新增字段 create_time, update_time

2、再次测试插入方法,我们需要先把实体类同步!

1
2
private Date createTime;
private Date updateTime;
  1. 再次更新查看结果即可

1.2 方式二:代码级别

1、删除数据库的默认值、更新操作!

2、实体类字段属性上需要增加注解

1
2
3
4
5
// 字段添加填充内容
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

3、编写处理器来处理这个注解即可!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component // 一定不要忘记把处理器加到IOC容器中!
public class MyMetaObjectHandler implements MetaObjectHandler {
// 插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill.....");
// setFieldValByName(String fieldName, Object fieldVal, MetaObject
// metaObject
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
// 更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill.....");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}

4、测试插入

5、测试更新、观察时间即可!

2. 乐观锁

简单理解:

  • 乐观锁 : 故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题,再次更新值测试
  • 悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!

这里主要讲解 乐观锁机制!

  • 乐观锁实现方式:

1.取出记录时,获取当前 version

2.更新时,带上这个version

3.执行更新时, set version = newVersion where version = oldVersion

4.如果version不对,就更新失败

1
2
3
4
5
6
7
8
## 大致原理分析
乐观锁:1、先查询,获得版本号 version = 1
-- A
update user set name = "zhuuu", version = version + 1
where id = 2 and version = 1
-- B 线程抢先完成,这个时候 version = 2,会导致 A 修改失败!
update user set name = "zhuuu", version = version + 1
where id = 2 and version = 1

2.1 MyBatis-Plus实现

1、给数据库中增加version字段!

2、实体类加对应的字段

1
2
@Version //乐观锁Version注解
private Integer version;

3、注册组件

1
2
3
4
5
6
7
8
9
10
11
// 扫描我们的 mapper 文件夹
@MapperScan("com.zhuuu.mapper")
@EnableTransactionManagement
@Configuration // 配置类
public class MyBatisPlusConfig {
// 注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}

4、测试一下!

1
2
3
4
5
6
7
8
9
10
11
// 测试乐观锁成功!
@Test
public void testOptimisticLocker(){
// 1、查询用户信息
User user = userMapper.selectById(1L);
// 2、修改用户信息
user.setName("朱酱酱");
user.setEmail("1235467@qq.com");
// 3、执行更新操作
userMapper.updateById(user);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 测试乐观锁失败!多线程下
@Test
public void testOptimisticLocker2(){
// 线程 1
User user = userMapper.selectById(1L);
user.setName("zhuuu111");
user.setEmail("2312312313@qq.com");
// 模拟另外一个线程执行了插队操作
User user2 = userMapper.selectById(1L);
user2.setName("zhuuu222");
user2.setEmail("12312312312@qq.com");
userMapper.updateById(user2);
// 自旋锁来多次尝试提交!
userMapper.updateById(user); // 如果没有乐观锁就会覆盖插队线程的值!
}

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信