MP:一些内容
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
-
引入依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1</version> </dependency>
-
使接口继承BaseMapper
-
直接使用BaseMapper中封装的方法
主键策略
使用@TableId中type类型指定主键策略
一般使用ASSIGN_ID或者AUTO
- ASSIGN,通过雪花算法生成一个19位的数字
- AUTO:自动自增。
雪花算法
长度共64bit(一个long型)。
首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。
41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。
10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。
12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。
优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高。
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
自动填充
需求描述:项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作
-
在表和类中添加createTime和updateTime
-
使用
@TableFiled
注解指定修改时机- DEFAULT
- INSERT,
- UPDATE,
- INSERT_UPDATE;
-
创建一个类,实现
MetaObjectHandler
@Component public class UserHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime",new Date(),metaObject); //创建时,也需要把updateTime修改 this.setFieldValByName("updateTime",new Date(),metaObject); } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime",new Date(),metaObject); } }
乐观锁
主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
乐观锁实现方式:
-
取出记录时,获取当前version
-
更新时,带上这个version
-
执行更新时, set version = newVersion where version = oldVersion
-
如果version不对,就更新失败
MP实现乐观锁
-
添加 @Version 注解
-
添加组件
@Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } //在MP3.4.0之后使用OptimisticLockerInnerInterceptor @Bean public OptimisticLockerInnerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInnerInterceptor(); }
MP的查询
- 批量查询
/**
* 批量查询
*/
@Test
void batchQuery() {
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
}
-
多条件查询
此时所述多条件为
“与”
/**
* 多条件查询
*/
@Test
void MultiQuery(){
HashMap hashMap = new HashMap();
hashMap.put("name","zhangsan");
hashMap.put("age","12");
userMapper.selectByMap(hashMap);
}
MP的删除
-
批量删除
与批量查询类似,使用Array的方法
/**
* 批量删除
*/
void batchDelete(){
userMapper.deleteBatchIds(Arrays.asList(1,2,3));
}
-
多条件删除
与多条件查询类似
此时所述多条件为
“与”
/**
* 多条件删除
*/
@Test
void MultiDelete(){
HashMap hashMap = new HashMap();
hashMap.put("name","zhangsan");
hashMap.put("age","12");
userMapper.selectByMap(hashMap);
}
-
逻辑删除与物理删除
物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据
逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
实现逻辑删除
-
数据库修改(添加字段)
-
实体类修改,添加属性,并使用
@TableLogic
注解 -
修改配置
mybatis-plus.global-config.db-config.logic-delete-value=1 #1为逻辑删除 mybatis-plus.global-config.db-config.logic-not-delete-value=0 #0为未被删除
-
MP的复杂查询
查询方式 | 说明 |
---|---|
setSqlSelect | 设置 SELECT 查询字段 |
where | WHERE 语句,拼接 + WHERE 条件 |
and | AND 语句,拼接 + AND 字段=值 |
andNew | AND 语句,拼接 + AND (字段=值) |
or | OR 语句,拼接 + OR 字段=值 |
orNew | OR 语句,拼接 + OR (字段=值) |
eq | 等于= |
allEq | 基于 map 内容等于= |
ne | 不等于<> |
gt | 大于> |
ge | 大于等于>= |
lt | 小于< |
le | 小于等于<= |
like | 模糊查询 LIKE |
notLike | 模糊查询 NOT LIKE |
in | IN 查询 |
notIn | NOT IN 查询 |
isNull | NULL 值查询 |
isNotNull | IS NOT NULL |
groupBy | 分组 GROUP BY |
having | HAVING 关键词 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last(“LIMIT 1”) |