mybatis-plus多数据库类型多数据源分页拦截器的配置


背景

springboot项目配置了postgreSQL与Oracle两种数据源,且两种数据库的查询都需要用到mybatis-plus的分页功能。

问题

Oracle数据库相关的业务,同事照着官方文档配置了分页拦截器

@Configuration 
public class MybatisPlusConfig { 
  @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { 
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.ORACLE)); 
    return interceptor; 
  } 
} 

等到我需要分页查询postgreSQL数据库时,控制台打印了报错的sql语句,却是Oracle数据库的方言(dialect),显然是分页拦截器抽风了。

解决

起初点进addInnerInterceptor()方法的源码,发现分页拦截器被放入了一个拦截器列表中,于是想都不想就继续添加了一个postgreSQL的分页拦截器:

interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL)); 

然而分页查询还是报同样的错误。继续浏览源码发现了这样一个方法:

  /**
     * 获取分页方言类的逻辑
     *
     * @param executor Executor
     * @return 分页方言类
     */
    protected IDialect findIDialect(Executor executor) {
        if (dialect != null) {
            return dialect;
        }
        if (dbType != null) {
            dialect = DialectFactory.getDialect(dbType);
            return dialect;
        }
        return DialectFactory.getDialect(JdbcUtils.getDbType(executor));
    }

也就是说没有设置数据库类型的时候,框架会根据数据库连接自动设置sql方言类型。显然之前配置分页拦截器的时候指定数据库类型是多此一举了。于是修改代码:

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

重新运行测试,问题已经解决。