背景
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;
}
}
重新運行測試,問題已經解決。