1、自动填充
需求描述:
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作
1.1 数据库的修改
在User表中添加datetime类型的新的字段 create_time、update_time
1.2 实体类的修改
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
// @TableId(type = IdType.ASSIGN_ID)
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
private Date createTime;
private Date updateTime;
}
1.1自动填充具体实现过程
-
在实体类中进行自动填充属性添加注解
@Data @NoArgsConstructor @AllArgsConstructor public class User { // @TableId(type = IdType.ASSIGN_ID) @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; }
-
创建类,实现接口MetaObjectHandler实现接口里面的方法
@Component public class MyMetaObjectHandler implements MetaObjectHandler { //使用map实现添加操作,这个方法执行 @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } //使用map实现修改操作,这个方法执行 @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime",new Date(),metaObject) } }
-
测试
@Test public void Add(){ User user = new User(); user.setName("jcl"); user.setAge(20); user.setEmail("1243qq.com"); //调用insert方法返回的使影响行数 int insert = userMapper.insert(user); System.out.println(insert); }
-
结果
JDBC Connection [HikariProxyConnection@427980296 wrapping com.mysql.cj.jdbc.ConnectionImpl@cc9ef8d] will not be managed by Spring ==> Preparing: INSERT INTO user ( id, name, age, email, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ? ) ==> Parameters: 1512012232764960769(Long), jcl(String), 20(Integer), 1243qq.com(String), 2022-04-07 18:19:42.778(Timestamp), 2022-04-07 18:19:42.778(Timestamp) <== Updates: 1
2、乐观锁
乐观锁:解决某些问题
主要解决:丢失问题
如果不考虑事物隔离性,产生读问题:
脏读,不可重复读,幻读
写问题:丢失更新问题
丢失更新:多个人同时操作同一条记录,最后提交事物的把之前提交数据覆盖[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
解决方法:
-
悲观锁:串行操作
-
乐观锁:
实现场景:当要更新一条数据的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
乐观锁的实现方式:
- 取出记录时,获取当前的version
- 更新时,带上version
- 执行更新时,set version = newVersion where version = oldVersion
- 如果version不对,就会更新失败
2.1乐观锁的实现具体过程
1.在数据库表中添加一个version字段
2.在实体类中加入@version,并且加入version成员变量
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
// @TableId(type = IdType.ASSIGN_ID)
// @TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
//添加版本号,实现乐观锁
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
}
3.配置一个乐观锁插件
新建一个配置类Mpconfig
@Configuration
@MapperScan("com.jcl.demomptest.mapper")
public class Mpconfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
4.测试乐观锁的效果
@Test
public void testOptimisticLocker() {
//根据id查询数据
User user = userMapper.selectById(1512027485926064130L);
//进行修改
user.setAge(200);
userMapper.updateById(user);
}