美文网首页程序员
mybatisplus-笔记

mybatisplus-笔记

作者: 马铃薯a | 来源:发表于2020-09-08 23:32 被阅读0次

    笔记是根据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_creat/creat_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<User> 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)
      

    相关文章

      网友评论

        本文标题:mybatisplus-笔记

        本文链接:https://www.haomeiwen.com/subject/bmvjektx.html