MybatisPlus自动填充和乐观锁
一、自动填充
1)数据库表结构
在sys_admin中添加 create_time,update_time
2)实体类添加注解
@Data
public class SysAdmin {
......
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
3)实现元对象处理器接口
@Component
public class MyMetaObjectHanlder implements MetaObjectHandler {
// 实现表添加时,属性的自动填充
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
// 实现表修改时,属性的自动修改
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
4)测试
@SpringBootTest
public class MybatsiPlusTest {
@Autowired
private SysAdminMapper adminMapper;
@Test
public void addTest(){
SysAdmin admin=new SysAdmin();
admin.setAdminName("greety");
admin.setAdminAge(18);
adminMapper.insert(admin);
}
@Test
public void updateTest(){
SysAdmin admin=new SysAdmin();
admin.setAdminId(1);
admin.setAdminName("linker");
admin.setAdminAge(22);
adminMapper.updateById(admin);
}
@Test
public void showTest(){
List<SysAdmin> sysAdmins = adminMapper.selectList(null);
System.out.println(sysAdmins);
}
}
二、乐观锁
1)乐观锁和悲观锁的介绍
乐观锁:并行解决,通过添加版本号的方法来控制数据库的数据
悲观锁:串行解决,一次只能由一个人进行操作,其他人都必须等待
乐观锁实现方式:
- 取出记录时,获取当前的version
- 更新时,带上这个version
- 执行更新时,set version=newVersion where version=oldVersion
- 如果version不对,就更新失败
2)数据库中添加version字段
ALTER TABLE `sysAdmin` ADD COLUMN `version` INT
- 实体类添加version字段
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
- 元对象处理接口添加version的insert默认值
@Override
public void insertFill(MetaObject metaObject) {
......
this.setFieldValByName("version", 1, metaObject);
}
5)创建一个新的配置类,将乐观锁的配置加入
@Configuration
@MapperScan("edu.mju.mybatis.plus.mapper")
public class MySpringConfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
三、分页
1)配置分页插件
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
2)测试分页
// 测试分页
@Test
public void testpage(){
// 1、创建page对象
//传入两个参数,第一个为当期页,第二位页面数量
Page<SysAdmin> page=new Page<SysAdmin>(1,3);
// 2、获取相对的添加页面信息
adminMapper.selectPage(page,null);
// 3、通过page对象获取分页数据
System.out.println(page.getCurrent()); // 当期页
System.out.println(page.getRecords());// 当期页数据
System.out.println(page.getSize());//当期页的数量
System.out.println(page.getTotal());//总记录数
System.out.println(page.hasNext());
System.out.println(page.hasPrevious());
}
四、删除
- 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据
- 逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
逻辑操作讲解:
1)表中添加逻辑删除字段
ALTER TABLE `sys_admin` ADD COLUMN `deleted` boolean
2)实体类中添加deleted字段
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
3)元对象处理接口添加deleted的insert默认值
@Override
public void insertFill(MetaObject metaObject) {
......
this.setFieldValByName("deleted", 0, metaObject);
}
4)在MySpringConfig配置类中注册Bean
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
五、性能分享
参数说明:
maxTime:sql执行时间多大时,停止查询
format:sql格式化,默认为false
1)在MySpringConifg配置插件
/**
* SQL 执行性能分析插件
* 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
2)在application.yml设置Dev环境
#环境设置:dev、test、prod
spring.profiles.active=dev
performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
2)在application.yml设置Dev环境
```yaml
#环境设置:dev、test、prod
spring.profiles.active=dev