Mybatis-plus支持Gbase8s分頁的實現示例
需求
實現mybatis-plus對gbase8s的分頁效果支持,使切換數據庫(如oracle/mysql/gbase8s)時同樣分頁插件代碼一樣實現分頁效果。
mybatis-plus版本:3.3.2
實現方法
修改Mybatis-plus源代碼,重新打jar包,引用其作為項目依賴。
尷尬的是,mybatis-plus源碼是gradle項目,目前沒學習過,結果改好瞭源碼不會打包…
在項目中重寫同包同類名的要修改的mybatis-plus源碼中的類,在項目啟動中,會優先加載項目裡的代碼而不是jar包裡的(適合本地,隻覆蓋,不改變源代碼)
在項目中重寫同包同類名的要修改的mybatis-plus源碼中的類,編譯後替換解壓的源代碼中的class文件,再重新打回jar包(適合本地/Linux服務器,修改瞭源代碼jar包)
因為暫未接觸gradle打包,所以本文介紹瞭方法2、方法3
法2實現
因為要重寫類,所以記得引入原mybatis-plus的jar包依賴
目錄如圖
修改JdbcUtils,在url判斷中增加gbase8s判斷
else if (jdbcUrl.contains(":gbasedbt-sqli:")){ return DbType.GBASE8S; }
在DbType類中增加對應值
/** * GBase8s */ GBASE8S("gbase8s", "南大通用數據庫"),
新增一個方言實現類GBase8sDialect
public class GBase8sDialect implements IDialect { @Override public DialectModel buildPaginationSql(String originalSql, long offset, long limit) { Integer index = originalSql.toLowerCase().indexOf("select"); StringBuilder sql = new StringBuilder(originalSql); sql.insert(index+6," skip " + FIRST_MARK + " first " + SECOND_MARK + " "); return new DialectModel(sql.toString(), offset, limit).setConsumerChain(); } }
在DialectRegistry中增加
dialect_enum_map.put(DbType.GBASE8S, new GBase8sDialect());
合計需要修改的類有JdbcUtils、DialectRegistry、DbType,同時新增一個方言類GBase8sDialect。
20210423 修改完善
上述情況有一個小bug:就是當該分頁查詢有多於2個參數(即不止分頁參數)時,因為mp默認分頁參數動態SQL參數匹配時在最後面,而Gbase8s的分頁參數是最前面兩個,所以出現參數位置匹配不正確的問題!當然,如果僅有兩個分頁參數則不影響
解決方案如下:
- 具體解決措施:重寫攔截器類PaginationInterceptor(com.baomidou.mybatisplus.extension.plugins),因為沒搞懂其參數添加源碼,所以直接用瞭個笨辦法,修改參數位置
- 在intercept方法中把參數List中最後兩個參數放置到最前面:在model.consumers(mappings, configuration, additionalParameters);後加以下代碼(大約在213行)
mappings.add(0,mappings.get(mappings.size()-2)); mappings.add(0,mappings.get(mappings.size()-1)); mappings.remove(mappings.size()-1); mappings.remove(mappings.size()-1);
20210519完善
之前的情況完全適用於Gbase8s,但如果考慮多數據庫情況下,例切換到Oracle,會因為最後兩個參數位置改變導致參數有誤,所以再次完善,把之前0423增加的代碼改為如下:
if(dbType.equals(DbType.GBASE8S)){ mappings.add(0,mappings.get(mappings.size()-1)); mappings.add(0,mappings.get(mappings.size()-2)); mappings.remove(mappings.size()-1); mappings.remove(mappings.size()-1); }
20210528完善
之前的代碼在IDEA等本地開發環境上可以使用成功,但是當部署在Linux服務器上時,可能還是直接引用瞭mybatis-plus源代碼,沒有使用到編譯後的覆蓋內容,導致不支持gbase8s.完善內容原理如下:
- 正常使用maven打包工具,項目打包後會有之前加入的覆蓋代碼編譯後的各種class文件
- 把mybatis-plus(以下簡稱mp)的原jar包解壓(實際上隻有兩個要改:mybatis-plus-extension-3.3.2.jar和mybatis-plus-annotation-3.3.2.jar),然後把第一步中編譯的覆蓋內容class文件覆蓋到解壓後的源代碼同路徑下(重復的替換,新增的增加)
- 把替換後的源代碼重新打成jar包
- //進入到源代碼目錄下,打開命令窗口,使用命令
jar cvf xxx.jar *
,會在當前目錄下生成新的xxxjar包 - 例:重新打mybatis-plus-extension-3.3.2.jar包
- 進入解壓後的mybatis-plus-extension-3.3.2目錄(該目錄下有com和META-INF文件夾),cmd打開命令窗口(路徑為當前目錄路徑),使用命令
jar cvf mybatis-plus-extension-3.3.2.jar *
,會在當前目錄下生成一個mybatis-plus-extension-3.3.2.jar包,把這個jar包替換maven庫中的同名jar包即可!另一個jar包同理
- //進入到源代碼目錄下,打開命令窗口,使用命令
- 因為直接替換瞭源代碼jar包,所以可以直接引用,同時可以把之前再項目例加的覆蓋內容去瞭
到此這篇關於Mybatis-plus支持Gbase8s分頁的實現示例的文章就介紹到這瞭,更多相關Mybatis-plus Gbase8s分頁 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Mybatis-Plus支持GBase8s分頁查詢的實現示例
- 在IDEA中maven配置MyBatis的流程詳解
- Mybatis 一級緩存和二級緩存原理區別
- mybatis-plus分頁如何接收前端參數limit和page
- mybatis接口綁定失效的解決