一、了解Mybatis-Plus
- 在MyBatis的基础上只做增强不做改变,为简化开发提高效率
1.快速入门
- 创建数据库,创建表
- 创建SpringBoot工程
- 引入MP以及相关依赖
- 在配置文件中配置数据库(Springboot版本不同,driver和url不同)
- 创建与数据库字段一致的实体类
- 创建Mapper接口继承BaseMapper,里面封装了MP大量CRUD方法,接口上添加Repository注解
- 启动类上添加MapperSan注解扫描Mapper
- 编写测试类
查看mybatis日志,在配置文件中写入
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
2.MP的主键策略
2.1 ASSIGN_ID
MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法)
@TableId(type = IdType.ASSIGN_ID)
private String id;
雪花算法:分布式ID生成器
雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。
核心思想:
长度共64bit(一个long型)。
首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。
41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。
10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。
12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。
优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高。
2.2 AUTO 自增策略
需要在创建数据表的时候设置主键自增
实体字段中配置 @TableId(type = IdType.AUTO)
@TableId(type = IdType.AUTO)
private Long id;
要想影响所有实体的配置,可以设置全局主键配置
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
3.自动填充
实体类修改
实体上增加字段并添加自动填充注解
@TableField(fill = FieldFill.***INSERT***) **private** Date **createTime**; *//create_time
@TableField(fill = FieldFill.***INSERT_UPDATE***) **private** Date **updateTime**; *//update_time*
实现元对象处理器接口
注意:不要忘记添加 @Component 注解
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//mp执行添加操作,这个方法执行
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName( "createTime" ,new Date(),metaObject);
this.setFieldValByName( "updateTime" ,new Date(),metaObject);
}
//mp执行修改操作,这个方法执行
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName( "updateTime" ,new Date(),metaObject); } }
4. 乐观锁实现流程
修改实体类
添加 @Version 注解
@Version
private Integer version;
创建配置文件
创建包config,创建文件MybatisPlusConfig.java
此时可以删除主类中的 @MapperScan 扫描注解
@Configuration
@MapperScan( "com.atguigu.demomptest.mapper")
public class** MpConfig { */** ** *乐观锁插件 */
@Bean
public** OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new** OptimisticLockerInterceptor();
} }
5.分页
MP配置类添加分页
@Bean
public PaginationInterceptor paginationInterceptor() {
**return new** PaginationInterceptor();
}
实现
//分页查询
@Test
public void** testSelectPage() {
Page<User> page = **new** Page(1,3);
Page<User> userPage = **userMapper**.selectPage(page, **null**);
//返回对象得到分页所有数据
long pages = userPage.getPages(); *//总页数
long current = userPage.getCurrent(); *//当前页
List<User> records = userPage.getRecords(); *//查询数据集合
long total = userPage.getTotal(); *//总记录数
boolean hasNext = userPage.hasNext(); *//下一页
boolean hasPrevious = userPage.hasPrevious(); *//上一页
System.out.println(pages);
System.out.println(current);
System.out.println(records);
System.out.println(total);
System.out.println(hasNext);
System.out.println(hasPrevious);
6.逻辑删除
逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
逻辑删除的使用场景:
-
可以进行数据恢复
-
有关联数据,不便删除 测试后发现,数据并没有被删除,deleted字段的值由0变成了1
测试后分析打印的sql语句,是一条update
注意:被删除前,数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作
二、条件构造器和常用
Wrapper : 条件构造抽象类,最顶端父类
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
QueryWrapper : 查询条件封装
UpdateWrapper : Update 条件封装
AbstractLambdaWrapper : 使用Lambda 语法
LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
@Test
public void testSelectListOrderBy() {
QueryWrapper<User>queryWrapper = newQueryWrapper<>();
queryWrapper.orderByDesc("age", "id")
List<User>users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
| 查询方式 | 说明 |
|---|---|
| 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”) |