本文是继 https://blog.csdn.net/qq_40865690/article/details/115636405 (5分钟用spring boot整合mybatis-plus实现crud)一文;继续实现的功能;
一.实现自动填充
需求:我们修改数据表后像日期的填充和修改由程序自动填充完成,可以借助mybatis-plus插件完成;
①在user表中添加数据库字段
②添加实体类属性并添加注解
@Data
public class User {
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;
}
③创建MyMetaObjectHandler 实现MetaObjectHandler 类,并重写填充方法
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时填充的方法
@Override
public void insertFill(MetaObject metaObject) {
//插入时将createTime和updateTime字段,赋值当前时间new Date()
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//修改时将updateTime字段,赋值当前时间new Date()
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
④在测试类中执行插入和修改测试
//2.测试插入
@Test
public void testSave() {
User user = new User();
// user.setId(8L);
user.setAge(23);
user.setEmail("123@qq.com");
user.setName("shu");
userMapper.insert(user);
}
结果:
二.线程安全操作数据库
了解悲观锁和乐观锁:
简单的说悲观锁操作数据库时就是单个操作数据库,上了一把锁,阻塞线程
而乐观锁操作数据库是添加一个版本号version;利用cas机制(check-and-set),实时监测修改
①在数据库中添加一个version字段
②添加实体类属性.并加注解@Version
@Data
public class User {
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;
}
③在MyMetaObjectHandler 实现MetaObjectHandler 类中,重写填充方法
在上面代码基础上添加 this.setFieldValByName(“version”,1,metaObject);
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时填充的方法
@Override
public void insertFill(MetaObject metaObject) {
//插入时将createTime和updateTime字段,赋值当前时间new Date()
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
//添加填充时赋值version1
this.setFieldValByName("version",1,metaObject);
}
//修改时将updateTime字段,赋值当前时间new Date()
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
④添加乐观锁插件
@Component
public class MpConfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
⑤修改测试
//先插入一条数据
@Test
public void testSave() {
User user = new User();
// user.setId(8L);
user.setAge(23);
user.setEmail("123@qq.com");
user.setName("shu");
userMapper.insert(user);
}
//3.测试修改version是否变化
@Test
public void testUpdate() {
//修改用户要根据id查询
User user =userMapper.selectById(1381528503537979393L);
user.setName("shum");
userMapper.updateById(user);
}
三.逻辑删除
实际开发不会直接删除数据表(物理删除);而是进行逻辑删除;即:将一个字段作为标记
①在表中创建deleted字段(tinyint对应java的Boolean类型或Integer类型)
②创建类属性,并添加注解@TableLogic
/**
* @author zhao
* @date 2021/4/10
* @desc
*/
@Data
public class User {
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;
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
}
③在MyMetaObjectHandler 实现MetaObjectHandler 类中,重写填充方法
在上面代码基础上添加 this.setFieldValByName(“version”,1,metaObject);
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时填充的方法
@Override
public void insertFill(MetaObject metaObject) {
//插入时将createTime和updateTime字段,赋值当前时间new Date()
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
//添加填充时赋值version1
this.setFieldValByName("version",1,metaObject);
//填充时赋值deleted为0;mybatis中默认0标识为未删除,1标识删除;也可以自定义配置
this.setFieldValByName("deleted",0,metaObject);
}
//修改时将updateTime字段,赋值当前时间new Date()
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
④添加逻辑删除插件
@Component
public class MpConfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
//逻辑删除插件
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
⑤测试逻辑删除
//测试逻辑删除
@Test
public void testDelete() {
userMapper.deleteById(1381528503537979393L);
}
结果: