Mybatis实现分库分表
生活随笔
收集整理的這篇文章主要介紹了
Mybatis实现分库分表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.jianshu.com/p/ba27cb6177e9
正文
首先實現org.apache.ibatis.plugin.Interceptor接口,復寫以下三個方法:
//實現攔截邏輯的地方,內部要通過invocation.proceed()顯式地推進責任鏈前進, //也就是調用下一個攔截器攔截目標方法Object intercept(Invocation invocation) throws Throwable; //用當前這個攔截器生成對目標target的代理,實際是通過Plugin.wrap(target,this)來完成的, //把目標target和攔截器this傳給了包裝函數 Object plugin(Object target); //設置額外的參數,參數配置在攔截器的Properties節點里 void setProperties(Properties properties);如果想要攔截所有的sql,在實現類上添加 annotation
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class})})注:Mybatis支持對Executor、StatementHandler、PameterHandler和ResultSetHandler進行攔截,也就是說會對這4種對象進行代理。
框架如上,具體實現有兩個重要點:
1 表的拆分規則
可以在Mapper對象中加上一個annotation,按以下方式去獲取:
String className = id.substring(0, id.lastIndexOf("."));Class classObj = Class.forName(className);//根據配置自動生成分表SQL TableSeg tableSeg = classObj.getAnnotation(TableSeg.class);TableSeg對象定義:
2 sql解析與替換
可以通過以下方法去獲取BoundSql,這個對象有關于這個sql的內容
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();BoundSql boundSql = statementHandler.getBoundSql();目前看到一些常規做法都是利用string 的replace方案替換sql中的表名,這顯然一個埋坑的做法。利用詞法分析器才是完美方案,可以使用antlr4,grammar文件可以去github上找到。
antlr值得深入學習。
總結
在編寫插件時需注意以下幾個原則:
1)不編寫不必要的插件;
2)實現plugin方法時判斷一下目標類型,是本插件要攔截的對象才執行Plugin.wrap方法,否者直接返回目標本省,這樣可以減少目標被代理的次數。
作者:harry_chen
鏈接:https://www.jianshu.com/p/ba27cb6177e9
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
轉載于:https://www.cnblogs.com/davidwang456/articles/8995401.html
總結
以上是生活随笔為你收集整理的Mybatis实现分库分表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Mycat中间件实现RDS MySQ
- 下一篇: commons-lang常用工具类Str