博为峰JavaEE技术文章 ——MyBatis 拦截器(2)拦截点

Advertisement

了解了Mybatis拦截器的接口Interceptor定义后,还需要进一步搞清楚这三个方法之间的关系,以及能够拦截哪些方法。

Mybatis在执行拦截器时,对三个接口的执行顺序:setProperties -> plugin -> intercept。先执行参数设置,然后生成代理对象,最后执行具体拦截操作。

在Mybatis官网,对能够拦截哪些类和方法做了说明。MyBatis 允许在已映射语句执行过程中的某一点调用拦截方法。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

1. 拦截执行器的方法

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

2. 拦截参数的处理

ParameterHandler (getParameterObject, setParameters)

3. 拦截结果集的处理

ResultSetHandler (handleResultSets, handleOutputParameters)

4. 拦截Sql语法构建的处理

StatementHandler (prepare, parameterize, batch, update, query)

要定义拦截器对哪些方法进行拦截,需要在拦截器接口实现类上添加注解@Intercepts。@Intercepts标记一个类是Interceptor,然后在@Intercepts中定义@Signature,即拦截点(可以有多个)。type是指拦截的接口,method是将要拦截的方法,args进一步指定了该方法的参数类型,以区分重载方法。

下面是一个注解的例子:


@Intercepts({@Signature(

type= Executor.class,

method = "update",

args = {MappedStatement.class,Object.class})

})

该注解对的含义是,拦截Executor接口的update方法(其实也就是SqlSession的新增,删除,修改操作),所有执行executor的update方法(有两个参数:MappedStatement.class,Object.class)都会被添加了该注解的拦截器拦截到。

Similar Posts:

  • 博为峰JavaEE技术文章 ——MyBatis 拦截器(1)接口简介

    学习过Struts之类MVC模式的WEB框架,对拦截器都不会很陌生.拦截器的主要作用就是拦截某些方法的调用,可以在被拦截的方法执行前,或者执行后后加上自定义的逻辑.也可以用自定义的逻辑替换被拦截方法的原有逻辑.Mybatis也提供了拦截器的功能.Mybatis拦截器设计的初衷就是为了在需要的时候可以方便的添加自定义逻辑,而不是去修改Mybatis的源代码. Mybatis提供了一个Interceptor接口,通过实现该接口就可以定义拦截器.接口的定义如下图所示: 接口中共有三个方法:interc

  • 博为峰JavaEE技术文章 ——MyBatis 缓存(3)自定义缓存

    我们了解了Mybatis的session级别的一级缓存和全局级别的二级缓存,那么缓存是如何运作的呢?今天小博老师给大家实现一个自定义的二级缓存,帮助理解cache的运作流程. 自定义缓存只需要实现一个接口:org.apache.ibatis.cache.Cache即可.先来看一下这个接口的定义: 接口中共有七个方法,我们队每个方法做一个简单说明. getId():获取cache对象的唯一标示,该标识在对象创建时传入(构造函数). putObject():把key-value键值对存放到cache

  • 博为峰Java技术文章 ——JavaSE Swing GridBagLayout布局管理器I

    博为峰小博老师: CardLayout布局管理器非常简单,它将容器中的每一个组件当作一个卡片,一次仅有一个卡片可见,如最初显示容器时,CardLayout对象的第一个组件可见,其他的组件都是不可见的.下面将以表格的形式给出CardLayout布局管理器的构造器,如下图所示. 在这个布局管理器中有一些常用方法,其方法说明如下: 以上介绍了CardLayout的构造器和常用方法,下章节为大家设计一个CardLayout程序实例.

  • 日记 [2008年04月21日] 看来这个博客只能发技术文章了

    特别提示: 发以下文章内容的将被直接删除BLOG: 1.发表时事.政治.反动.社会评论.军事评论.宗教性文章. 2.色情.挑逗.性描写类文章或图片. 3.包括但不限于赌博.诈骗.贩卖毒品.卫星电视设备.办证等等非法内容. 发以下内容将被删除文章: 1.显示出来,文不对题. 2.显示出来,系统分类不正确. 3.显示出来的广告类文章. 这个提示好恐怖呀,我读来读去,不知道这个博客可以发表什么类型的文章了,看本网站定位极其明确:就是一个专业的技术性博客,博主想发表技术文章以外的任何文章的念头请自动打消

  • Strust2拦截器自定义拦截器实例--登录

    一.理解Struts2拦截器 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可动态配置的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack).Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链.在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用. 二.实现Struts2拦截器原理(拦截器栈) 拦截器链(Interceptor Chain,在S

  • (六) CXF 拦截器--自定义拦截器

    [一 SOAP 消息简介] 简单对象访问协议是交换数据的一种协议规范,是一种轻量的.简单的.基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息. CXF 中自定义拦截器,其实就是对SOAP 消息的封装和解析. <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> 不是强制出现的, head 元素的内容由程序员控制添加, 主要用于携带一些

  • 博为峰Java技术题 ——JavaSE 避免死锁Ⅰ

    在有些情况下死锁是可以避免的.下面将展示三种用于避免死锁的技术: [加锁顺序] 博为峰小博老师: 当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生. 如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生.看下面这个例子: 如果一个线程(比如线程3)需要一些锁,那么它必须按照确定的顺序获取锁.它只有获得了从顺序上排在前面的锁之后,才能获取后面的锁. 例如,线程2和线程3只有在获取了锁A之后才能尝试获取锁C(获取锁A是获取锁C的必要条件).因为线程1已经拥有了锁A,所

  • 博为峰Java技术题 ——JavaSE 创建对象Ⅱ

    [使用clone方法] 博为峰小博老师: 实际上无论何时我们调用clone() 方法,JAVA虚拟机都为我们创建了一个新的对象并且复制了之前对象的内容到这个新的对象中.使用 clone()方法创建对象不会调用任何构造函数. 为了在对象中使用clone()方法,我们需要在其中实现可克隆类型并定义clone()方法. [使用反序列化] 博为峰小博老师: 无论何时我们对一个对象进行序列化和反序列化,JAVA虚拟机都会为我们创建一个单独的对象.在反序列化中,JAVA虚拟机不会使用任何构造函数来创建对象.

  • 博为峰Java技术题 ——JavaSE 日期时间Ⅱ

    [使用SimpleDateFormat格式化日期] 博为峰小博老师: SimpleDateFormat是一个以语言环境敏感的方式来格式化和分析日期的类.SimpleDateFormat允许你选择任何用户自定义日期时间格式来运行.例如: 以上实例编译运行结果如下: [简单的DateFormat格式化编码] 博为峰小博老师: 时间模式字符串用来指定时间格式.在此模式中,所有的ASCII字母被保留为模式字母,定义如下: [使用printf格式化日期] 博为峰小博老师: printf方法可以很轻松地格式

  • Mybatis使用拦截器自动分页实现/使用反射替换sql代码分页

    本文章内容代码来自互联网,扒拉下来使用无参数的分页成功,但是带参数的分页就抛出异常.本代码解决了该异常.使用mysql成功.oracle 没有环境.没有测试.这个是改造之后的,最后有详细注释的版本. 简单总结下思路: MyBatis允许开发者在StatementHandler.ResultSetHandler.ParameterHandler以及Executor插入自己想执行的代码,使用plugin是将你插件放入到MyBatis的插件集合中去. 1.使用拦截到的对象中的参数,我们按照正常的初始化

Tags: