插件
分页插件
配置方法
@Configuration
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 如果配置多个插件,切记分页最后添加
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
return interceptor;
}
}
属性介绍
overflow
boolean
false
溢出总页数后是否进行处理(默认不处理,参见 插件#continuePage
方法)
maxLimit
Long
单页分页条数限制(默认无限制,参见 插件#handlerLimit
方法)
dbType
DbType
数据库类型(根据类型获取应使用的分页方言,参见 插件#findIDialect
方法)
dialect
IDialect
方言实现类(参见 插件#findIDialect
方法)
建议单一数据库类型的均设置 dbType
Page
该类继承了 IPage
类,实现了简单分页模型,如果你要实现自己的分页模型可以继承 Page
类或者实现 IPage
类。
records
List
emptyList
查询数据列表
total
Long
0
查询列表总记录数
size
Long
10
每页显示条数,默认 10
current
Long
1
当前页
orders
List
emptyList
排序字段信息,允许前端传入的时候,注意 SQL 注入问题,可以使用 SqlInjectionUtils.check(...)
检查文本
optimizeCountSql
boolean
true
自动优化 COUNT SQL 如果遇到 jSqlParser
无法解析情况,设置该参数为 false
optimizeJoinOfCountSql
boolean
true
自动优化 COUNT SQL 是否把 join 查询部分移除
searchCount
boolean
true
是否进行 count 查询,如果只想查询到列表不要查询总记录数,设置该参数为 false
maxLimit
Long
单页分页条数限制
countId
String
xml
自定义 count
查询的 statementId
也可以不用指定在分页 statementId
后面加上 _mpCount
例如分页 selectPageById
指定 count 的查询 statementId
设置为 selectPageById_mpCount
即可默认找到该 SQL
执行
乐观锁插件
当要更新一条记录的时候,希望这条记录没有被别人更新,就需要加上乐观锁,乐观锁可以通过版本号的方式实现,具体实现方式如下:
配置方法
@Configuration
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {
/**
* 添加乐观锁插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
注解
在实体类的字段上加上 @Version
注解即可,如下:
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
@Version
private Integer version;
}
注意
支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
在整数类型下,
newVersion = oldVersion + 1
乐观锁插件只支持
updateById(id)
与update(entity, wrapper)
方法在
update(entity, wrapper)
方法下,wrapper 不能复用!!!
多租户插件
多租户实现方式有两种,一种是数据库 schema 级别的多租户,另一种是业务数据列的多租户,具体实现方式如下:
配置方法
public interface TenantLineHandler {
/**
* 获取租户 ID 值表达式,只支持单个 ID 值
* <p>
*
* @return 租户 ID 值表达式
*/
Expression getTenantId();
/**
* 获取租户字段名
* <p>
* 默认字段名叫: tenant_id
*
* @return 租户字段名
*/
default String getTenantIdColumn() {
// 如果该字段你不是固定的,请使用 SqlInjectionUtils.check 检查安全性
return "tenant_id";
}
/**
* 根据表名判断是否忽略拼接多租户条件
* <p>
* 默认都要进行解析并拼接多租户条件
*
* @param tableName 表名
* @return 是否忽略, true:表示忽略,false:需要解析并拼接多租户条件
*/
default boolean ignoreTable(String tableName) {
return false;
}
}
防止全表更新与删除插件
针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除
注入 MybatisPlusInterceptor 类,并配置 BlockAttackInnerInterceptor 拦截器
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor;
}
}
@SpringBootTest
public class QueryWrapperTest {
@Autowired
private UserService userService;
/**
+ SQL:UPDATE user SET name=?,email=?;
*/
@Test
public void test() {
User user = new User();
user.setId(999L);
user.setName("custom_name");
user.setEmail("xxx@mail.com");
// com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of table update operation
userService.saveOrUpdate(user, null);
}
}
动态表名插件
数据权限插件
数据变动记录插件
非法 SQL 阻断插件
最后更新于
这有帮助吗?