MybatisPlus——DML编程控制

DML编程控制

概览

  • Insert
  • Delete
  • Update
Id生成策略控制
  • 不同的表应用不同的id生成cel

    • 日志:自增(1,2,3,4, .....)
    • 购物订单:特殊规则(FQ23948AK3843)
    • 外卖单:关联地区日期等信息(10 04 20200314 34 91)
    • 关系表:可省略id
    • ...
  • id生成策略注解

    • 名称:@TableId

    • 类型:属性注解

    • 位置:模型类中用于表示主键的属性定义上方

    • 作用:设置当前类中主键属性的生成策略、

    • 范例:

      public class User{
      	@Table(type = idType.AUTO)
      	private Long id;
      }
      
    • 相关属性:

      • value:设置数据库主键名称
      • type:设置主键属性的生成策略,值参照IdType枚举值
    • 相关方法:

      • idType.AUTO(0): 使用数据库id自增策略控制id生成

      • idType.NONE(1): 不设置id生成策略

      • INPUT(2): 用户手工输入id

      • ASSIGN_ID(3):雪花算法生成id(可兼容数值型与字符串类型)

        占位符加时间戳加5+5的机器码加上序列号

      • ASSIGN_UUID(4):以UUID生成算法作为id生成策略

    • 全局配置:【写在yml里面】

      # 开启mp的日志(输出到控制台)
      mybatis-plus:
        configuration:
          log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        global-config:
          banner: false
      #    字段映射和,id生成策略,以及表名前缀的全局配置
          db-config:
            id-type: auto
            table-prefix: tbl_
      

      注意:

      注解优先于配置

      如果id生成策略为UUID则主键要为String类型

      如果id生成策略为雪花算法的主键则要为Integer类型

多记录操作
  • 按照主键删除多条记录

    List<Long> ids = Arrays.asList(new Long[]{2,3});
    userDao.deleteBatcheIds(ids);
    
  • 根据主键查询多条记录

    List<Long> ids = Arrays.asList(new Long[](2,3));
    List<User> userList = userDao.selectBatchIds(ids);
    
逻辑删除
  • 删除操作业务问题:业务数据从数据库中丢弃
  • 逻辑删除:为数据设置是否可用状态的字段,删除时设置状态字段为不可用状态,数据保留在数据库中
逻辑删除案例
  1. 数据库表中添加逻辑删除标记字段,记得添加默认值

  2. 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

    public class User{
    	private Long id;
    	@TableLogic
    	private Integer deleted;
    }
    
  3. 或者配置逻辑删除字面值【通用性强】

    mybatis-plus:
    #      全局配置逻辑删除,单行数据状态,是已经被删除还是存在
          logic-delete-field: deleted
          logic-delete-value: 1
          logic-not-delete-value: 0
    

    执行的SQL语句:UPDATE tbl_user SET delete = 1 where id = ? AND deleted = 0

乐观锁
  • 业务并发现象带来的问题:秒杀
乐观锁案例
  1. 数据库表中添加锁标记字段

  2. 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

    public class User{
    	private Long id;
    	@Version
    	private Integer version;
    }
    
  3. 配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装

    @Configuration
    public class MpConfig{
    	@Bean
    	public MybatisPlusInterceptor mpInterceptor(){
    		MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
    		mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor));
    		return mpInterceptor;
    	}
    }
    
  4. 使用乐观锁机制在修改前必须先获取对应数据的version方可正常进行

    @Test
    void testUpdate(){
    	//先查询数据,获取到version数据
    	User user  = userDao.selectById(1L);
    	//执行数据修改操作
    	user.setName("Tom and Jerry");
    	userDao.updateById(user);
    }
    

    执行修改前先执行查询语句:

    SELECT id,name,age,tel,deleted,version FROM tbl_book WHERE id=?
    

    执行修改时使用version字段作为乐观锁检查依据

    UPDATE tbl_book SET name=?,age=?,tel=?,vesion=? WHERE id=? AND version=?
    
总结
  1. id自增策略控制(Insert)
  2. 多记录操作(Delete、Select)
  3. 逻辑删除(Delete/Update)
  4. 乐观锁(Update)
posted @ 2022-12-13 23:00  筝弈  阅读(50)  评论(0编辑  收藏  举报
2 3
4