谷粒学院(三)----MyBatics-Plug高级使用

  1. 主键生成策略
  • 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为随机生成一个

图片

  1. 自动填充

项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。

我们可以使用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);
}

图片

大家发现数据库中的更新时间已经添加了。

  1. 乐观锁
  • 概念:解决某些问题
  • 主要适用场景:当更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新。也就是多线程中的银行取钱问题。

图片

  • 乐观锁实现方式:取出记录时,获取当前version—>更新是,带上这个version–>执行更新时,set version =new Version where version =oldVersion—>如果version不对,更新失败。
  1. 乐观锁的具体实现
  • 数据库中添加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);

图片

  1. 分页

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());
}
  1. 性能分析插件
  • 性能分析拦截器,用于输出每条 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);
}

图片

猜你喜欢

转载自blog.csdn.net/qq_44762290/article/details/107432411