插件

分页插件

配置方法

@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 阻断插件

最后更新于

这有帮助吗?