环境搭建
- 依赖
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
启动类:@MapperScan("com.bky.mapper")
主键策略
四种主键策略介绍
- 自动增长 AUTU INCERMENT
需要得到上一个表的最后id值
- UUID 每次生成随机唯一的值
排序不方便,但是不需要关注上一个表的最后id值
- redis实现
- 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位值,字符串类型使用这个策略
自动填充
- 数据库表中添加update_time和create_time两个字段
- 在实体类中添加对应的属性
- 在实体类,给需要自动填充的属性添加注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
- 创建类,实现接口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. 幻读
- 产生写问题: 丢失更新问题
乐观锁实现方式
- 取出记录时,获取当前的version
- 更新时,带上这个version
- 执行更新时,set version=newVersion where version=oldversion
- 如果version不对,就更新失败
具体mp实现
- 数据库中添加verison字段
- 实体类添加version字段,并在该字段上加上@version,并设置其默认值
- 配置乐观锁插件
@Configuration
@MapperScan("com.bky.mapper")
public class MpOptimisticLockConfig {
//配置乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
- 测试
@Test
void testOptimisticLocker(){
//工具id查询数据
User user = userMapper.selectById(1383746022467039233L);
user.setAge(102);
userMapper.updateById(user);
}