目录
[1.1 安装插件](#1.1 安装插件)
[1.2 使用](#1.2 使用)
写在前面:
在上篇的mybatisplus中介绍到了其概念,其中包括了什么是mybatisplus以及已经有了mybatis但是我们为什么使用它,介绍到了他给我们带来的便利之处(本篇会继续讲解mybatisplus的功能),还介绍到了安装以及一些常用的注解和条件构造器(很重要),那就继续开启新篇章吧!上篇文章入口。
一、mybatisplus扩展功能
1、代码生成
在使用MybatisPlus以后,基础的Mapper
、Service
、PO
代码相对固定,重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成PO
、Mapper
、Service
等相关代码。只不过代码生成器同样要编码使用,也很麻烦。
这里推荐大家使用一款MybatisPlus
的插件,它可以基于图形化界面完成MybatisPlus
的代码生成,非常简单。
1.1 安装插件
在Idea
的plugins市场中搜索并安装MyBatisPlus
插件:
然后重启你的idea即可使用
1.2 使用
对于一些比较重要的数据,我们往往会采用逻辑删除的方案,即:
-
在表中添加一个字段标记数据是否被删除
-
当删除数据时把标记置为true
-
查询时过滤掉标记为true的数据
一旦采用了逻辑删除,所有的查询和删除逻辑都要跟着变化,非常麻烦。为了解决这个问题,MybatisPlus就添加了对逻辑删除的支持。
注意,只有MybatisPlus生成的SQL语句才支持自动的逻辑删除,自定义SQL需要自己手动处理逻辑删除。
首先要准备一张数据库的表(注意:需要是一个没有编写三层架构的表不然就不能体现到这款插件的魅力了),然后在菜单栏找到此处
在弹出的窗口中填写数据库连接的基本信息
点击OK保存。
然后再次点击Idea顶部菜单中的other,然后选择Code Generator
:
在弹出的表单中填写信息:
最终,代码自动生成到指定的位置了:
2、逻辑删除
对于一些比较重要的数据,我们往往会采用逻辑删除的方案,即:
-
在表中添加一个字段标记数据是否被删除
-
当删除数据时把标记置为true
-
查询时过滤掉标记为true的数据
一旦采用了逻辑删除,所有的查询和删除逻辑都要跟着变化,非常麻烦。为了解决这个问题,MybatisPlus就添加了对逻辑删除的支持。
要实现逻辑删除其实也很简单,首先需要在数据库表中新增一个逻辑删除的字段,接着要在其对应的实体类中新增逻辑删除的字段对应的属性,接着需要在yaml文件中做如下配置
mybatis-plus:
global-config:
db-config:
ogic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
开启了逻辑删除功能以后,我们就可以像普通删除一样做CRUD,基本不用考虑代码逻辑问题。还是非常方便的。
但是有一点需要注意:逻辑删除只有MybatisPlus生成的SQL语句才支持自动的逻辑删除,自定义SQL需要自己手动处理逻辑删除。
注意:
逻辑删除本身也有自己的问题,比如:
-
会导致数据库表垃圾数据越来越多,从而影响查询效率
-
SQL中全都需要对逻辑删除字段做判断,影响查询效率
因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。
二、插件功能
1、分页插件
MybatisPlus提供了很多的插件功能,进一步拓展其功能。目前已有的插件有:
-
PaginationInnerInterceptor
:自动分页 -
TenantLineInnerInterceptor
:多租户 -
DynamicTableNameInnerInterceptor
:动态表名 -
OptimisticLockerInnerInterceptor
:乐观锁 -
IllegalSQLInnerInterceptor
:sql 性能规范 -
BlockAttackInnerInterceptor
:防止全表更新与删除
注意:
使用多个分页插件的时候需要注意插件定义顺序,建议使用顺序如下:
-
多租户,动态表名
-
分页,乐观锁
-
sql 性能规范,防止全表更新与删除
这里我们以分页插件为里来学习插件的用法。如果想要了解其他插件请前往官网自行了解。
在未引入分页插件的情况下,MybatisPlus
是不支持分页功能的,IService
和BaseMapper
中的分页方法都无法正常起效。
所以,我们必须配置分页插件。
首先在项目中新建一个配置类:
其代码如下:
java
package com.itheima.mp.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 初始化核心插件
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
配置完成之后就可以使用mybatisplus中提供的分页功能了
2、示例
编写一个分页查询的测试:
java
@Test
void testPageQuery() {
// 1.分页查询,new Page()的两个参数分别是:页码、每页大小
Page<User> p = userService.page(new Page<>(2, 2));
// 2.总条数
System.out.println("total = " + p.getTotal());
// 3.总页数
System.out.println("pages = " + p.getPages());
// 4.数据
List<User> records = p.getRecords();
records.forEach(System.out::println);
}
使用提供的分页插件功能之前需要先提供一个page对象,其中封装的有当前页码,每页大小,还有分页结果的排序条件,全部封装完之后调用mybatisplus提供的分页方法然后将分页对象传入进去即可,此处直接在参数部分new了一个page对象未指定排序字段以及排序规则。
运行结果如下:
从运行结果中的sql语句中可以看出mybaitsplus帮我们拼接了limit分页条件
如果想要指定排序方法以及指定字段可以参考以下方法
java
int pageNo = 1, pageSize = 5;
// 分页参数
Page<User> page = Page.of(pageNo, pageSize);
// 排序参数, 通过OrderItem来指定
page.addOrder(new OrderItem("balance", false));
userService.page(page);
orderItem即是封装排序字段以及指定升序还是降序的对象、此处指定排序字段为balance且为降序排列。