【MyBatis-Plus】多数据源分页配置(低版本暂时就支持一种(可选),高版本多支持)

【转载】一、Mybatis Plus 3.4 版本之后分页插件的变化

1、地址

Mybatis Plus 3.4版本之后分页插件的变化

2、内容

1、MybatisPlusInterceptor

Mybatis Plus 3.4.0 版本开始,不再使用旧版本的 PaginationInterceptor,而是使用 MybatisPlusInterceptor

MybatisPlusInterceptor 是一系列的实现 InnerInterceptor 的拦截器链,也可以理解为一个集合。可以包括如下的一些拦截器

  • 自动分页:PaginationInnerInterceptor(最常用)
  • 多租户:TenantLineInnerInterceptor
  • 动态表名:DynamicTableNameInnerInterceptor
  • 乐观锁:OptimisticLockerInnerInterceptor
  • sql 性能规范:IllegalSQLInnerInterceptor
  • 防止全表更新与删除:BlockAttackInnerInterceptor

2、旧版分页插件配置方法(Mybatis Plus 3.4.0版本之前)

java 复制代码
@Configuration
@MapperScan(basePackages = {"com.zimug.**.mapper"})
public class MybatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}

3、新的分页插件配置方法(Mybatis Plus 3.4.0 版本及其之后的版本)

新的分页插件,一缓和二缓遵循 mybatis 的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题

java 复制代码
@Configuration
@MapperScan(basePackages = {"com.zimug.**.mapper"})
public class MybatisPlusConfig {

  /**
   * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
   */
  @Bean
  public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    // 向 Mybatis 过滤器链中添加分页拦截器
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    // 还可以添加其他的拦截器
    return interceptor;
  }

  @Bean
  public ConfigurationCustomizer configurationCustomizer() {
    return configuration -> configuration.setUseDeprecatedExecutor(false);
  }
}

4、分页查询的使用方法

分页查询的使用方法没有变化,仍然和 Mybatis 之前的版本一致,没有变化。 这里简单举一个例子

java 复制代码
// 查询第 pageNum 页,每页 pageSize 条数据
Page<SysUserOrg> page = new Page<> (pageNum,pageSize);
// 将分页参数 page 作为 Mybatis 或 Mybatis Plus 的第一个参数传入持久层函数,即可完成分页查询
return mySystemMapper.selectUser(page, 其他参数 );

二、低版本 3.0.7.1

1、MybatisPlusConfig 代码

java 复制代码
package com.greatoo.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * mybatis-plus配置
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置方言,多方言设置暂时找不到如何处理,低版本暂时只找到这一种处理方法
        paginationInterceptor.setDialectType(DbType.SQL_SERVER2005.getDb());
        return paginationInterceptor;
    }

    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }
}

2、DbType 代码

java 复制代码
package com.baomidou.mybatisplus.annotation;

import lombok.Getter;

@Getter
public enum DbType {
    /**
     * MYSQL
     */
    MYSQL("mysql", "%s LIKE CONCAT('%%',#{%s},'%%')", "MySql数据库"),
    /**
     * MARIADB
     */
    MARIADB("mariadb", "%s LIKE CONCAT('%%',#{%s},'%%')", "MariaDB数据库"),
    /**
     * ORACLE
     */
    ORACLE("oracle", "%s LIKE CONCAT(CONCAT('%%',#{%s}),'%%')", "Oracle数据库"),
    /**
     * DB2
     */
    DB2("db2", "%s LIKE CONCAT(CONCAT('%%',#{%s}),'%%')", "DB2数据库"),
    /**
     * H2
     */
    H2("h2", "%s LIKE CONCAT('%%',#{%s},'%%')", "H2数据库"),
    /**
     * HSQL
     */
    HSQL("hsql", "%s LIKE CONCAT('%%',#{%s},'%%')", "HSQL数据库"),
    /**
     * SQLITE
     */
    SQLITE("sqlite", "%s LIKE CONCAT('%%',#{%s},'%%')", "SQLite数据库"),
    /**
     * POSTGRE
     */
    POSTGRE_SQL("postgresql", "%s LIKE CONCAT('%%',#{%s},'%%')", "Postgre数据库"),
    /**
     * SQLSERVER2005
     */
    SQL_SERVER2005("sqlserver2005", "%s LIKE '%%'+#{%s}+'%%'", "SQLServer2005数据库"),
    /**
     * SQLSERVER
     */
    SQL_SERVER("sqlserver", "%s LIKE '%%'+#{%s}+'%%'", "SQLServer数据库"),
    /**
     * DM
     */
    DM("dm", null, "达梦数据库"),
    /**
     * UNKONWN DB
     */
    OTHER("other", null, "其他数据库");

    /**
     * 数据库名称
     */
    private final String db;
    /**
     * LIKE 拼接模式
     */
    private final String like;
    /**
     * 描述
     */
    private final String desc;


    DbType(String db, String like, String desc) {
        this.db = db;
        this.like = like;
        this.desc = desc;
    }

    /**
     * <p>
     * 获取数据库类型(默认 MySql)
     * </p>
     *
     * @param dbType 数据库类型字符串
     */
    public static DbType getDbType(String dbType) {
        DbType[] dts = DbType.values();
        for (DbType dt : dts) {
            if (dt.getDb().equalsIgnoreCase(dbType)) {
                return dt;
            }
        }
        return OTHER;
    }
}

3、多数据源处理可参考(不确定能否实现,可以试试看)

SpringBoot 配置双数据源,MyBatis-Plus 分页插件配置

三、高版本 3.5.3.1

1、MybatisPlusConfig 代码

java 复制代码
package io.renren.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * mybatis-plus配置
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * 防止修改与删除时对全表进行操作
     */
    @Bean
    public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
        return new BlockAttackInnerInterceptor();
    }

    /**
     * 新的分页插件,一缓和二缓遵循 mybatis 的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 里面不要填写 DbType.MYSQL 做限制,就能支持多数据源
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}
相关推荐
孤蓬&听雨6 个月前
MyBatis和MyBatis Plus比较详解
java·mybatis·mybatis plus·持久层
鱼鱼大头鱼7 个月前
1. 使用MyBatis的ResultHandler实现流式查询,避免大数据量一次加载
mybatis·mybatis plus·resulthandler·mybatis流式查询·流式查询
厂里英才7 个月前
Mybatis plus批量插入的优化
java·spring boot·后端·mybatis plus
青石路7 个月前
都说了能不动就别动,非要去调整,出生产事故了吧 → 补充
mybatis·mybatis plus·druid·hikari
strggle_bin9 个月前
使用Mybatis-plus分页查询的Total与实际条数不对应
mybatis plus
求知.1 年前
【MyBatis Plus】深入探索 MyBatis Plus 的条件构造器,自定义 SQL语句,Service 接口的实现
mybatis plus
求知.1 年前
【MyBatis Plus】初识 MyBatis Plus,在 Spring Boot 项目中集成 MyBatis Plus,理解常用注解以及常见配置
mybatis plus
Hello Dam1 年前
若依管理系统后端将 Mybatis 升级为 Mybatis-Plus
mybatis·若依管理系统·mybatis plus