mybatis plus-笔记

笔记是根据B站”遇见狂神说“的视频记得。
点我跳转视频

日志配置

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

CRUD扩展

主键生成策略

对应数据库的主键:uuid、自增id、雪花算法、redis、zookeeper

雪花算法:

SnowFlake 算法是 Twitter 开源的分布式 id 生成算法,结果是一个Long型的ID。其核心思想就是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID)12bit作为毫秒内的流水号(意味着每个节点可以产生4096个id),最后还有一个符号位,永远是0。(使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。)

全局唯一ID

@TableId(type=IdType.ID_WORKER) // 默认ID_WORKER 全局唯一的id

主键自增

  1. 实体类的字段上@TableId(type=IdType.AUTO)
  2. 数据库的表格中需要设定上自增。
public enum idType{
    AUTO(0),  //数据库id自增
    NONE(1),  //未设置主键
    INPUT(2),  //手动输入
    ID_WORKER(3),  //默认的全局唯一id
    UUID(4),  //全局唯一id  uuid
    ID_WORKER_STR(5);  // ID_WORKER 字符串表示法
}

自动填充

创建时间(gmt_create/create_time),修改时间(gmt_modified/update_time)--- 自动生成;

方式一:数据库级别

时间戳,数据库的类型:datetime

当前时间的时间戳:CURRENT_TIMESTAMP

方式二:代码级别

  1. 实体类写法

    ···
    // 字段添加的填充内容
    @TableField(fill = FielFill.INSERT)
    private Date createTime;
    
    @TableField(fill = FielFill.INSERT_UPDATE)
    private Date updateTime;
    
  2. @slf4j
    @Component  // 一定不要忘记吧处理器加到IOC容器中!
    public class MyMetaObjectHandler implements MetaObjectHandler{
        // 插入时的填充策略
        @Override
        public void insertFill(MetaObject metaObject){
            log.into("start insert fill...... ");
            //setFieldvalByName(String fieldName, object dieldVal, MetaObject metaoBject)
            this.setFieldValByName("createTime",new Date(),metaobject);
            this.setFieldValByName("createTime",new Date(),metaobject); 
        }
    
        // 更新时的填充策略
        @Override
        public void updateFill(MetaObject metaObject){
            log.info("start insert fill...... ");
            this.setFieldValByName("createTime",new Date(),metaobject);
        }
    }
    

乐观锁

乐观锁:总是认为不会出现问题,无论干什么都不去上锁!如果出现了问题,再次跟新测试

version、new version

实现方式:

  1. 取出记录时,获取当前version
  2. 更新时,带上这个version
  3. 执行更新时,set version = newVersion where version = oldVersion
  4. 如果version不对,就更新失败

代码:

  1. 在数据库中添加version字段;设定默认值为1 。

  2. 在实体类中添加相应的字段。

    @Version
    private Integer version;
    
  3. 注册组件

    @MapperScan("com.kuang.mapper")
    @EnableTransactionManagement
    @Configuration  //配置类
    
    // 注册乐观锁
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
    

悲观锁:总是认为出问题,无论干什么都会上锁!再去操作。

查询

xxxMapper.selectBatchIds(Arrays.asList(1,2,3))

分页查询

常用:

  1. 原始的limt进行分页
  2. pageHelper 第三方插件
  3. MP 其实也内置了分页插件

如何使用

@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}

//简化版本
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}


// 使用类
public void testPage(){
    // 参数一:当前页
    // 参数二:页面大小
    Page page = new Page<>(1,5);
    userMapper.selectPage(Page,null);
    
    page.getRecords().forEach(System.out::println);
    
    int aa = page.getTotal();  // 获取分页的总数
}

性能分析插件

mybatisplus 提供性能分析插件,如果超过这个时间就会停止运行。

作用:分析每条SQL执行的时间。

配置:

@Bean
@Profile({"dev","test"})  // 设置 dev test 环境开启,保证我们的效率
public PerformanceInterceptor performanceInterceptor(){
    PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
    performanceInterceptor.setMaxTime(1);  // 设置时间
    performanceInterceptor.setFormat(true);  //开启SQL格式化的效果
    return performanceInterceptor;
}

条件构造器

逻辑删除

  1. 数据库增加字段:deleted

  2. 实体类:

    @TableLogic  //逻辑删除
    private Integer deleted;
    
  3. 配置:

    mybatis-plus:
      global-config:
        db-config:
          logic-delete-field: flag  # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
          logic-delete-value: 1 # 逻辑已删除值(默认为 1)
          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    

你可能感兴趣的:(mybatis plus-笔记)