mybati-plus(CURD操作、乐观锁、分页查询、条件构造器Wrapper、代码自动生成器)

一、CURD

  1. INSERT

    mybatis-plus会帮我们自动生成id(全局唯一),这就是主键生成策略。相关博客

    uuid、自增id、雪花算法、redis、zookeeper
    

    雪花算法:

    snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。
    
  2. 主键生成策略详解

    1. 主键自增

      1. 在实体类字段上增加注解==@TableId(type = IdType.AUTO)==

      2. 数据库字段一定要是自增的

      3. 测试

          @Test
          public void testInsert() {
            User user = new User();
            user.setName("olarian");
            user.setAge(21);
            user.setEmail("niu@ola.com");
            userMapper.insert(user);
          }
        
    2. IdType枚举类型解释

          AUTO(0),自增
          NONE(1),未设置主键
          INPUT(2),手动输入
          ASSIGN_ID(3),
          ASSIGN_UUID(4),
      
  3. UPDATE

      @Test
      public void testUpdate() {
        User user = new User();
        user.setId(6L);
        user.setName("olatest");
        userMapper.updateById(user);
      }
    
  4. SELECT

      @Test
      public void testSelect() {
        userMapper.selectById(1L);
        // 批量查询
        userMapper.selectBatchIds(Arrays.asList(1, 2, 3)).forEach(System.out::println);
      }
    

    多条件查询:

      @Test
      public void testSelectByMap() {
        Map<String, Object> objectObjectMap = new HashMap<>();
        // 自定义要查询的条件(多条件查询)
        objectObjectMap.put("name", "Jone");
        userMapper.selectByMap(objectObjectMap);
      }
    
  5. DELETE

      @Test
      public void testDelete() {
        userMapper.deleteById(8L);
      }
    

    **逻辑删除:**不从数据库中移除数据,而是通过一个变量来让他失效!deleted=0 => deleted=1!防止数据丢失,类似于回收站。

    实现方式:

    1. 在数据表中增加一个deleted字段

    2. 实体类增加字段并添加@TableLogic注解

    3. application.yaml配置

      mybatis-plus:
        configuration:
          log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      
        global-config:
          db-config:
            logic-delete-field: deleted
            logic-delete-value: 1
            logic-not-delete-value: 0
      
    4. 测试

        @Test
        public void testDelete() {
          userMapper.deleteById(1L);
        }
      
    5. 再次查询已无查询结果

  6. 自动填充

    1. 方式一

      数据库级别修改

      1. 在表中新增字段create_time,update_time
      2. 同步实体类
      3. 测试
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FxVKHJXk-1616556549823)(../../Library/Application%20Support/typora-user-images/image-20210324094657302.png)]
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87s5Ijx0-1616556549824)(../../Library/Application%20Support/typora-user-images/image-20210324094429131.png)]

    2. 方式二

      代码级别修改

      1. 删除数据库的默认值、更新操作
      2. 实体类字段属性上增加注解
      
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class User {
        @TableId(type = IdType.AUTO)
        private Long id;
      
        private String name;
        private Integer age;
        private String email;
      
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
      
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
      }
      
      3. 编写处理器来处理这个注解
      
      @Component
      @Slf4j
      public class UserHandler implements MetaObjectHandler {
      
        @Override
        public void insertFill(MetaObject metaObject) {
          log.info("start insert fill");
          this.setFieldValByName("createTime", new Date(), metaObject);
          this.setFieldValByName("updateTime", new Date(), metaObject);
        }
      
        @Override
        public void updateFill(MetaObject metaObject) {
          log.info("start insert fill");
          this.setFieldValByName("updateTime", new Date(), metaObject);
        }
      }
      
      
      4. 测试
      

二、乐观锁

实现方式:

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

测试MP的乐观锁插件

  1. 给数据库中增加version字段

  2. 同步实体类字段,version字段上增加@Version注解

  3. 注册组件

    @Configuration
    @MapperScan("com.ola.mapper")
    @EnableTransactionManagement // 自动管理事务
    public class MybatisPlusConfig {
      // 注册乐观锁插件
      @Bean
      public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
        return new OptimisticLockerInnerInterceptor();
      }
    }
    
    
  4. 测试

  5. 说明

    1.支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
    2.整数类型下 newVersion = oldVersion + 1
    3.newVersion 会回写到 entity 中
    4.仅支持 updateById(id) 与 update(entity, wrapper) 方法
    5.在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
    

三、分页查询

  1. 原始Limit分页

  2. pageHelper等第三方插件分页

  3. MP内置的分页插件

    1. 注册分页插件

      @Configuration
      @MapperScan("com.ola.mapper")
      @EnableTransactionManagement
      public class MybatisPlusConfig {
        /** 注册乐观锁插件 */
        @Bean
        public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
          return new OptimisticLockerInnerInterceptor();
        }
        /** 分页插件 */
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
          MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
          interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
          return interceptor;
        }
      }
      
    2. 直接使用page对象测试

        @Test
        public void testPage() {
          Page<User> page = new Page<>(1, 2);
          userMapper.selectPage(page, null);
          page.getRecords().forEach(System.out::println);
        }
      

四、条件构造器Wrapper(用于复杂查询)

看文档去吧

五、代码自动生成器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值