mybatis拦截器,也就是插件。
在之前学习javaweb时,有filter过滤器,mybatis的拦截器与之很相似。
mybatis的拦截器在映射语句执行过程中进行拦截,而且只能拦截四大对象中的方法。
1.Executor 执行器对象
2.ParameterHander 参数处理器对象
3.ResultSetHander 结果集处理器对象
4.StatementHander 构建sql语句处理器对象
使用拦截器的步骤
1.创建类实现Interceptorj接口,设置@Intercepts,重写接口中的方法
@Intercepts({@Signature( type = Executor.class,//对象类型,只能是四大对象类型 method = "update", //拦截方法 args ={MappedStatement.class,Object.class/*方法中用到的参数类型*/})})//可以点击拦截对象查看拦截方法的参数, public class PageIntercepts implements Interceptor { // 拦截方法,返回结果:目标方法执行后返回的结果 @Override public Object intercept(Invocation invocation) throws Throwable { return invocation.proceed(); } // 获取配置文件中的参数信息,该方法可以不重写 @Override public void setProperties(Properties properties) { } }
2.注册插件
至此一个拦截器就完成了。
下面我们自己写一个基于拦截器的分页插件,通过改造上面的模板:
@Intercepts({@Signature( type = StatementHandler.class,//对象类型,只能是四大对象类型 method = "prepare", //拦截方法 args ={Connection.class,Integer.class/*方法中用到的参数类型*/})})//可以点击拦截对象查看拦截方法的参数, public class PageIntercepts implements Interceptor { // 拦截方法,返回结果:目标方法执行后返回的结果 @Override public Object intercept(Invocation invocation) throws Throwable { //获取目标对象 StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); // 获取要执行的sql命令 String sql = statementHandler.getBoundSql().getSql(); System.out.println("要执行的sql命令为:"+sql); // 为sql语句添加分页 sql+=" limit 0,10"; // 元数据对象,可以对原始数据进行操作 MetaObject metaObject = SystemMetaObject.forObject(statementHandler); // 重新绑定修改后的sql语句 metaObject.setValue("boundSql.sql", sql); // 执行目标方法 return invocation.proceed(); }
在配置文件注册该拦截器后,进行测试