mybatis拦截器,分页插件

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();
    }

在配置文件注册该拦截器后,进行测试

原文地址:https://www.cnblogs.com/Zs-book1/p/11279345.html