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;
    }
}

重新運行測試,問題已經解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM