基於mybatis攔截器分表實現

一、攔截器簡介

MyBatis提供了一種插件(plugin)的功能,但其實這是攔截器功能。基於這個攔截器咱們能夠選擇在這些被攔截的方法執行先後加上某些邏輯或者在執行這些被攔截的方法時執行本身的邏輯。java

這點跟spring的攔截器是基本一致的。它的設計初衷就是爲了供用戶在某些時候能夠實現本身的邏輯而沒必要去動Mybatis固有的邏輯。spring

攔截器的使用中,分頁插件應該是使用得最多的了。分表的實現也差很少相似。sql

二、攔截的方法調用

MyBatis 容許你在已映射語句執行過程當中的某一點進行攔截調用。默認狀況下,MyBatis 容許使用插件來攔截的方法調用包括:數據庫

  1. Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  2. ParameterHandler (getParameterObject, setParameters)
  3. ResultSetHandler (handleResultSets, handleOutputParameters)
  4. StatementHandler (prepare, parameterize, batch, update, query)

整體歸納爲:apache

  1. 攔截執行器的方法
  2. 攔截參數的處理
  3. 攔截結果集的處理
  4. 攔截Sql語法構建的處理

 咱們看到了能夠攔截Executor接口的部分方法,好比update,query,commit,rollback等方法,還有其餘接口的一些方法等。mybatis

這4各方法在MyBatis的一個操做(新增,刪除,修改,查詢)中都會被執行到,執行的前後順序是Executor,ParameterHandler,ResultSetHandler,StatementHandler。undefinespa

三、Interceptor接口

瞭解到了攔截器可以攔截的方法調用,就須要看看攔截接口是如何實現的了。插件

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。設計

  • intercept方法就是要進行攔截的時候要執行的方法。
  • setProperties方法是用於在Mybatis配置文件中指定一些屬性的。
  • plugin方法是攔截器用於封裝目標對象的,經過該方法咱們能夠返回目標對象自己,也能夠返回一個它的代理。當返回的是代理的時候咱們能夠對其中的方法進行攔截來調用intercept方法,固然也能夠調用其餘方法。

分表實現

一、大致思路

由於我是想要 按月 分表,數據庫表裏增長了一個string類型字段 account_month 來記錄月份,分表字段就使用account_month。代理

分表表名:表名_年月   例如明細表:date_detail_201607。

分表是一月一張表,分表的創建就是默認創建了12個分表,若是超出了,後續再手工添加吧。也能夠寫個腳本每個月底建立下一個月的表,可是我以爲沒啥必要。就算哪天忘記添加了,代碼邏輯的異常處理流程裏面也可以保證個人數據不丟失,啓動一下異常數據處理也就妥妥的了。

在sql語句裏面會要求帶上分表字段,經過分表字段計算獲得分表的表名,而後替換掉原來的sql,直接將數據路由到指定的分表就好了。

聽起來好像很簡單的樣子,那麼就這麼出發吧。

二、問題目錄

分表開始以前的問題: 

  1. Mybatis如何找到咱們新增的攔截服務。
  2. 自定義的攔截服務應該在什麼時間攔截查詢動做。即什麼時間截斷Mybatis執行流。
  3. 自定義的攔截服務應該攔截什麼樣的對象。不能攔截什麼樣的對象。
  4. 自定義的攔截服務攔截的對象應該具備什麼動做才能被攔截。
  5. 自定義的攔截服務如何獲取上下文中傳入的參數信息。
  6. 如何把簡單查詢,神不知鬼不覺的,無侵入性的替換爲分表查詢語句。
  7. 最後,攔截器應該如何交還被截斷的Mybatis執行流。

帶着這些問題,咱們來看看咱們自定義的攔截服務是如何實現的。

三、逐步實現

3.1 Mybatis如何找到咱們新增的攔截服務

對於攔截器Mybatis爲咱們提供了一個Interceptor接口,前面有提到,經過實現該接口就能夠定義咱們本身的攔截器。自定義的攔截器須要交給Mybatis管理,這樣才能使得Mybatis的執行與攔截器的執行結合在一塊兒,即,攔截器須要註冊到mybatis-config配置文件中。

經過在Mybatis配置文件中plugins元素下的plugin元素來進行。一個plugin對應着一個攔截器,在plugin元素下面咱們能夠指定若干個property子元素。Mybatis在註冊定義的攔截器時會先把對應攔截器下面的全部property經過Interceptor的setProperties方法注入給對應的攔截器。

 

涉及代碼,須要從新整理model,待續~~

相關文章
相關標籤/搜索