MyBatis-Plus 自动填充和乐观锁
一、MyBatis-Plus 自动填充
1.1、需求描述
在现实业务场景中经常会遇到一些数据项,每次都使用相同的方式填充,例如用户上线与线下时间等。这里MyBatis-Plus为开发者提供了自动填充功能,完成对应数据段的赋值工作。
1.2、实例讲解
根据MP 入门实践这篇文章为前提,我们需要在原有数据库初始数据表上添加字段项,模拟现实业务场景。
(1)在User表中添加datetime类型的新的字段 create_time(创建数据时间)、update_time(更新数据时间):
alter table user add create_time datetime;
alter table user add update_time datetime;
(2)实体上增加字段并添加自动填充注解
//添加数据时,填充数据
@TableField(fill = FieldFill.INSERT)
private Date createTime;
//更新数据时,填充数据
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
(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);
}
}
(4)测试
1、插入新数据
// 添加数据
@Test
public void testAdd() {
User user = new User();
user.setName("小李");
user.setAge(20);
user.setEmail("1243@qq.com");
int insert = userMapper.insert(user);
System.out.println(insert);
}
2、更新数据
// 修改数据
@Test
public void updateData(){
User user = new User();
user.setId(1413086639927959553L);
user.setName("lucyYY");
int count = userMapper.updateById(user);
System.out.println(count);
}
二、MyBatis-Plus 乐观锁
2.1、应用场景
对于某些数据项,当要进行更新的时候,同时系统这条记录不给别人更新,也就是说实现线程安全的数据更新。例如银行的金融业务。
2.2、乐观锁实现
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
- 如果version对,就执行更新并version+1(或者其他改变version的方式)
2.3、实例讲解
(1)在User表中添加int类型的Version(版本号)字段
alter table user add version int(10);
(2)修改实体类与元对象处理器接口
1、修改实体类
//version版本号 用于mp的乐观锁操作
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
2、修改元对象处理器接口
@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);
//添加数据时,version默认填充为1
this.setFieldValByName("version",1,metaObject);
}
//mp执行更新操作时,执行此操作
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
(3)创建配置文件并注册乐观锁插件
创建包config,创建文件MpConfig类
@Configuration
@MapperScan("com.mybatisplus.demo.mapper")
public class MpConfig {
/**
* 乐观锁插件(注册乐观锁插件)
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
(4)测试
//测试mp的乐观锁功能
@Test
public void testOptimisticLockerInterceptor(){
User user = userMapper.selectById(1413086639927959553L);
user.setName("小黄");
userMapper.updateById(user);
}
修改结果: