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);
逻辑删除
- 删除操作业务问题:业务数据从数据库中丢弃
- 逻辑删除:为数据设置是否可用状态的字段,删除时设置状态字段为不可用状态,数据保留在数据库中
逻辑删除案例
-
数据库表中添加逻辑删除标记字段,记得添加默认值
-
实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
public class User{ private Long id; @TableLogic private Integer deleted; }
-
或者配置逻辑删除字面值【通用性强】
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
乐观锁
- 业务并发现象带来的问题:秒杀
乐观锁案例
-
数据库表中添加锁标记字段
-
实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
public class User{ private Long id; @Version private Integer version; }
-
配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装
@Configuration public class MpConfig{ @Bean public MybatisPlusInterceptor mpInterceptor(){ MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor(); mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor)); return mpInterceptor; } }
-
使用乐观锁机制在修改前必须先获取对应数据的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=?
总结
- id自增策略控制(Insert)
- 多记录操作(Delete、Select)
- 逻辑删除(Delete/Update)
- 乐观锁(Update)