Mybatis中分页拦截器的实现说明

需要入手即用的案例源码,可跳过本章前面介绍部分,直接看中间部分的案例

首先我们了解一下,sqlsession中四个核心对象的关系:

        mybatis 拦截器默认可拦截的类型只有四种,即四种接口类型 Executor、StatementHandler、ParameterHandler 和 ResultSetHandler

 

 

四个对象之间的调用关系:

(1)Executor实现类中无论是doUpdate()还是doQuery()方法都会调用Configuration.newStatementHandler(),在其中通过RouteStatementHandler的构造方法,根据语句类型,委派到不同的语句处理器(SimpleStatementHandler、PreparedStatementHandler、CallableStatementHandler)

(2)再调用BaseStatementHandler里prepare()方法预编译SQL语句

(3)用parameterize()方法来使用ParameterHandler对象设置参数,完成预编译(如果执行的sql有参数的话,会用到该对象)

(4)执行查询的话,使用ResultHandler将结果返回给调用者,其他操作也类似。

可拦截的对象及方法:

 

 

mybatis 自定义拦截器,三步骤:

  1. 实现 intercepts接口
  2. 添加拦截注解 @Intercepts

         mybatis 拦截器默认可拦截的类型只有四种,即四种接口类型 Executor、StatementHandler、ParameterHandler 和 ResultSetHandler

对于我们的自定义拦截器必须使用 mybatis 提供的注解来指明我们要拦截的是四类中的哪一个类接口

具体规则如下:

a:Intercepts 标识我的类是一个拦截器

b:Signature 则是指明我们的拦截器需要拦截哪一个接口的哪一个方法

  •         type 对应四类接口中的某一个,比如是 Executor
  •         method 对应接口中的哪类方法,比如 Executor 的 update 方法
  •         args 对应接口中的哪一个方法,比如 Executor 中 query 因为重载原因,方法有多个,args 就是指明参数类型,从而确定是哪一个方法

    3.配置文件中添加拦截器

拦截器其实就是一个 plugin,在 mybatis 核心配置文件中我们需要配置我们的 plugin

(这里注意一下我们添加plugins标签的位置):


       
	       
	       
   		

如果与Spring整合后,则可在applicationContext.xml中的配置如下:


    
    


		
		
		
		
    
        
    

拦截器顺序

1. 配置的拦截器拦截顺序:

     相对于同一个拦截对象(如:StatementHandler)而言,在 mybatis 核心配置文件根据配置的位置,拦截顺序是 从上往下进行拦截创建代理对象的,而执行的intercept()拦截方法则是逆序执行的(因为最后拦截的拦截器产生的代理对象,包裹了前面拦截器的代理对象),借用网上一哥们的图,如下:

Mybatis中分页拦截器的实现说明_第1张图片

2.同一个拦截器中不同拦截对象的拦截顺序:

     Executor -> ParameterHandler -> StatementHandler -> ResultSetHandler

首先我们需要了解拦截器中需要用到的各个对象的作用:

1.MappedStatement

        MappedStatement类在Mybatis框架中用于表示XML文件中一个sql语句节点,比如Mapper.xml中一个 select id, username from author where id = #{value}

        Mybatis对Mapper.xml文件的配置读取和解析后,会根据mapper的id注册多个MappedStatement对象,分别对应其中id为“selectAuthorLinkedHashMap”和“xxx”等等的