基于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,待续~~

相关文章
相关标签/搜索