public Object intercept(Invocation invocation) throws Throwable { StatementHandler statementHandler = (StatementHandler)invocation.getTarget(); MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY); MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement"); // 配置文件中SQL语句的ID String id = mappedStatement.getId(); if(id.matches(".+ByPage$")) { BoundSql boundSql = statementHandler.getBoundSql(); // 原始的SQL语句 String sql = boundSql.getSql(); // 查询总条数的SQL语句 String countSql = "select count(*) from (" + sql + ")a"; Connection connection = (Connection)invocation.getArgs()[0]; PreparedStatement countStatement = connection.prepareStatement(countSql); ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler"); parameterHandler.setParameters(countStatement); ResultSet rs = countStatement.executeQuery(); Map<?,?> parameter = (Map<?,?>)boundSql.getParameterObject(); Page page = (Page)parameter.get("page"); if(rs.next()) { page.setTotalNumber(rs.getInt(1)); } // 改造后带分页查询的SQL语句 String pageSql = sql + " limit " + page.getDbIndex() + "," + page.getDbNumber(); metaObject.setValue("delegate.boundSql.sql", pageSql); } return invocation.proceed(); }
拦截器中 中途查询了记录总条数,若要把该总条数传给外部控制如Service层要怎么做?
想把rs.getInt(1)的值传给拦截器外部类使用
我上面给出的代码中
Page page = (Page)parameter.get("page");// 22行
这个page对象作用范围只是在 intercept(){}方法内,而intercept方法只是 拦截器类的一个方法(该拦截器类继承了Interceptor)并不是action 所在的类,我是想把mybatis的Mapper接口中dao操作方法返回查询结果集记录条数和查询结果集。
核心问题就是:实现Interceptor接口时,自定义步骤中产生的变量如何传出到action方法内(该变量不是查询结果集)
HashMap<Integer,Message> map =new HashMap<Integer,Message>(); map= (HashMap<Integer, Message>) messageMapper.queryMessageRange(5,5,"asd"); // 我的理解 这里的map就是返回的查询结果集。messageMapper是一个DAO实现类,内部有封装的查询方法,例如queryMessageRange()
Page page = (Page)parameter.get("page");
这条语句只是获取了一个page对象的一个引用,在servlet调用service,service调用dao,PageInterceptor
拦截器拦截器拦截page,page不断的在改变,当调用完成,值就已经在最开始那个page对象里面了。
setTotalNumber已经在page了,通过servlet的request方法获取,再传递给service