MyBatis提供了一種插件(plugin)的功能,但其實這是攔截器功能。基於這個攔截器咱們能夠選擇在這些被攔截的方法執行先後加上某些邏輯或者在執行這些被攔截的方法時執行本身的邏輯。java
這點跟spring的攔截器是基本一致的。它的設計初衷就是爲了供用戶在某些時候能夠實現本身的邏輯而沒必要去動Mybatis固有的邏輯。spring
攔截器的使用中,分頁插件應該是使用得最多的了。分表的實現也差很少相似。sql
MyBatis 容許你在已映射語句執行過程當中的某一點進行攔截調用。默認狀況下,MyBatis 容許使用插件來攔截的方法調用包括:數據庫
整體歸納爲:apache
咱們看到了能夠攔截Executor接口的部分方法,好比update,query,commit,rollback等方法,還有其餘接口的一些方法等。mybatis
這4各方法在MyBatis的一個操做(新增,刪除,修改,查詢)中都會被執行到,執行的前後順序是Executor,ParameterHandler,ResultSetHandler,StatementHandler。undefinespa
瞭解到了攔截器可以攔截的方法調用,就須要看看攔截接口是如何實現的了。插件
package
org.apache.ibatis.plugin;
import
java.util.Properties;
public
interface
Interceptor {
Object intercept(Invocation invocation)
throws
Throwable;
Object plugin(Object target);
void
setProperties(Properties properties);
}
|
接口中一共定義有三個方法,intercept、plugin 、setProperties。設計
由於我是想要 按月 分表,數據庫表裏增長了一個string類型字段 account_month 來記錄月份,分表字段就使用account_month。代理
分表表名:表名_年月 例如明細表:date_detail_201607。
分表是一月一張表,分表的創建就是默認創建了12個分表,若是超出了,後續再手工添加吧。也能夠寫個腳本每個月底建立下一個月的表,可是我以爲沒啥必要。就算哪天忘記添加了,代碼邏輯的異常處理流程裏面也可以保證個人數據不丟失,啓動一下異常數據處理也就妥妥的了。
在sql語句裏面會要求帶上分表字段,經過分表字段計算獲得分表的表名,而後替換掉原來的sql,直接將數據路由到指定的分表就好了。
聽起來好像很簡單的樣子,那麼就這麼出發吧。
分表開始以前的問題:
帶着這些問題,咱們來看看咱們自定義的攔截服務是如何實現的。
對於攔截器Mybatis爲咱們提供了一個Interceptor接口,前面有提到,經過實現該接口就能夠定義咱們本身的攔截器。自定義的攔截器須要交給Mybatis管理,這樣才能使得Mybatis的執行與攔截器的執行結合在一塊兒,即,攔截器須要註冊到mybatis-config配置文件中。
經過在Mybatis配置文件中plugins元素下的plugin元素來進行。一個plugin對應着一個攔截器,在plugin元素下面咱們能夠指定若干個property子元素。Mybatis在註冊定義的攔截器時會先把對應攔截器下面的全部property經過Interceptor的setProperties方法注入給對應的攔截器。
涉及代碼,須要從新整理model,待續~~