更新時(shí)間:2022-06-16 09:48:58 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2684次
MyBatis分庫分表如何實(shí)現(xiàn)?動(dòng)力節(jié)點(diǎn)小編來告訴大家。
首先實(shí)現(xiàn)org.apache.ibatis.plugin.Interceptor接口,復(fù)寫以下三個(gè)方法:
實(shí)現(xiàn)攔截邏輯的地方,內(nèi)部要通過invocation.proceed()顯式地推進(jìn)責(zé)任鏈前進(jìn),也就是調(diào)用下一個(gè)攔截器攔截目標(biāo)方法。
Object intercept(Invocation invocation) throws Throwable;
用當(dāng)前這個(gè)攔截器生成對(duì)目標(biāo)target的代理,實(shí)際是通過Plugin.wrap(target,this)來完成的,把目標(biāo)target和攔截器this傳給了包裝函數(shù)。
Object plugin(Object target);
設(shè)置額外的參數(shù),參數(shù)配置在攔截器的Properties節(jié)點(diǎn)里。
void setProperties(Properties properties);
如果想要攔截所有的sql,在實(shí)現(xiàn)類上添加 annotation
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare",
args = {Connection.class})})
注:Mybatis支持對(duì)Executor、StatementHandler、PameterHandler和ResultSetHandler進(jìn)行攔截,也就是說會(huì)對(duì)這4種對(duì)象進(jìn)行代理。
框架如上,具體實(shí)現(xiàn)有兩個(gè)重要點(diǎn):
1.表的拆分規(guī)則
可以在Mapper對(duì)象中加上一個(gè)annotation,按以下方式去獲?。?/p>
String className = id.substring(0, id.lastIndexOf("."));
Class classObj = Class.forName(className);
//根據(jù)配置自動(dòng)生成分表SQL
TableSeg tableSeg = classObj.getAnnotation(TableSeg.class);
TableSeg對(duì)象定義:
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TableSeg {
/**
* 表名
* @return
*/
public String tableName();
/**
* 分表方式,取模,如%5:表示取5余數(shù),
* 如果不設(shè)置,直接根據(jù)shardBy值分表
* @return
*/
public String shardType();
/**
* 根據(jù)什么字段分表
* 多個(gè)字段用數(shù)學(xué)表達(dá)表示,如a+b a-b
* @return
*/
public String shardBy();
}
2.sql解析與替換
可以通過以下方法去獲取BoundSql,這個(gè)對(duì)象有關(guān)于這個(gè)sql的內(nèi)容
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
BoundSql boundSql = statementHandler.getBoundSql();
目前看到一些常規(guī)做法都是利用string 的replace方案替換sql中的表名,這顯然一個(gè)埋坑的做法。利用詞法分析器才是完美方案,可以使用antlr4,grammar文件可以去github上找到。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)