- 主键生成策略
-
ID_WORKER
MyBatis-Plug默认的主键策略是:ID_WORKER 全局唯一ID
-
参考资料为:分布式系统唯一ID生成方案汇总
https://www.cnblogs.com/haoxinyue/p/5208136.html
- 在我们队主键id使用注解的时候,我们可以对其进行注解,在属性前面加上注解
- 这里一般有几种方式:AUTO 自动增长 input自己输入 ID开头的为mybatis-plug自带的方式
ASSIGN_UUID和ASSIGN_ID为随机生成一个
- 自动填充
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:
1)数据库表中添加自动填充字段
在User表中添加datetime类型的新的字段 create_time、update_time
2)实体上添加注解
(3)实现元对象处理器接口
创建类,实现接口MetaObjectHandler
public class MyMetaObjectHandler implements MetaObjectHandler {}
- 添加方法
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);
public void insertFill(MetaObject metaObject){
LOGGER.info("start insert fill ....");
this.setFieldValByName("creatTime",new Date(),metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
public void updateFill(MetaObject metaObject) {
LOGGER.info("start update fill ....");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
- 测试
public void update(){
User user=new User();
user.setId(2L);
user.setAge(80);
int row=userMapper.updateById(user);
System.out.print(row);
}
大家发现数据库中的更新时间已经添加了。
- 乐观锁
- 概念:解决某些问题
- 主要适用场景:当更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新。也就是多线程中的银行取钱问题。
- 乐观锁实现方式:取出记录时,获取当前version—>更新是,带上这个version–>执行更新时,set version =new Version where version =oldVersion—>如果version不对,更新失败。
- 乐观锁的具体实现
- 数据库中添加version属性
ALTER TABLE `user` ADD COLUMN 'version' int
- 实体类添加version的insert默认值
public void insertFill(MetaObject metaObject){
this.setFieldValByName("version",1,metaObject);
}
- 在user中加上版本注解
特别说明:
-
支持的数据类型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime
-
整数类型下
newVersion = oldVersion + 1
-
newVersion
会回写到entity
中 -
仅支持
updateById(id)
与update(entity, wrapper)
方法 -
在
update(entity, wrapper)
方法下,wrapper
不能复用!!! -
编写配置类,因为我们通常有很多注解直接写在起始类中,这样不太好,因为启动类尽可能简单,我们可以帮我们的注解单独放在一个专门的配置类中,类名为Mybatisplusconfig
@Configuration
@MapperScan("com.atguigu.mpdemo1010.mapper")
public class MybatisPlusConfig {
//配置乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
- 乐观锁测试方法
//①:测试成功
@Test
public void testLGS(){
//查询
User user=userMapper.selectById(3L);
//修改数据
user.setName("wangwu");
user.setEmail("[email protected]");
userMapper.updateById(user);
}
}
//更新失败
@Test
public void testOptimisticLockerFail(){
//查询
User user=userMapper.selectById(3l);
//修改数据
user.setName("lisi");
user.setEmail("[email protected]");
//模拟取出数据后,数据库中的version实际数据比取出时要大,因为数据一旦被取出,数据库中的值就会变化,即已经被其他线程修改并更新了version
user.setVersion(user.getAge()-1);
//执行更新
userMapper.updateById(user);
- 分页
MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能
(1)创建配置类
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
(2)测试selectPage分页
**测试:**最终通过page对象获取相关数据
@Test
public void testSelectMapsPage() {
Page<User> page = new Page<>(1, 5);
IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, null);
//注意:此行必须使用 mapIPage 获取记录列表,否则会有数据类型转换错误
mapIPage.getRecords().forEach(System.out::println);
System.out.println(page.getCurrent());
System.out.println(page.getPages());
System.out.println(page.getSize());
System.out.println(page.getTotal());
System.out.println(page.hasNext());
System.out.println(page.hasPrevious());
}
- 性能分析插件
- 性能分析拦截器,用于输出每条 SQL 语句及其执行时间,SQL 性能执行分析,开发环境使用,超过指定时间,停止运行。有助于发现问题。
1、配置插件
(1)参数说明
参数:maxTime: SQL 执行最大时长,超过自动停止运行,有助于发现问题。
参数:format: SQL是否格式化,默认false。
- 2)在 MybatisPlusConfig 中配置
/**
* 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;
}
3)Spring Boot 中设置dev环境
#环境设置:dev、test、prod
spring.profiles.active=dev
2、测试
**
* 测试 性能分析插件
*/
@Test
public void testPerformance() {
User user = new User();
user.setName("我是Helen");
user.setEmail("[email protected]");
user.setAge(18);
userMapper.insert(user);
}