Mybatis分页拦截器

恩,先将就着看看,注释有时间补上,说实话写时间有点久了我自己有点看不懂了。。。。

@Intercepts({@Signature(type=StatementHandler.class, args = {Connection.class}, method = "prepare")})
public class PageInterceptor implements Interceptor {

    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,new DefaultReflectorFactory());
        MappedStatement statement=(MappedStatement)metaObject.getValue("delegate.mappedStatement");
        String id=statement.getId();
        if(id.matches(".+ByPage$")){//处理所有ByPage结尾的方法
            BoundSql boundSql = statementHandler.getBoundSql();
            String sql=boundSql.getSql();
            String countSql="select count(*) from ("+sql+") a";
            Connection connection=(Connection)invocation.getArgs()[0];
            PreparedStatement prepareStatement = connection.prepareStatement(countSql);
            ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler");
            parameterHandler.setParameters(prepareStatement);
            ResultSet rs=prepareStatement.executeQuery();
            Page page=null;
            Object obj = boundSql.getParameterObject();
            if(obj instanceof Map){
                Map map=(Map)obj;
                page=(Page)map.get("page");
            }

            if(rs.next()){
                page.setTotalNumber(rs.getInt(1));
            }
            String pageSql=sql+" limit "+page.getDbIndex()+","+page.getPageNumber();
            metaObject.setValue("delegate.boundSql.sql",pageSql);
        }
        return invocation.proceed();
    }

    public Object plugin(Object target) {

        return Plugin.wrap(target, this);
    }

    public void setProperties(Properties arg0) {
        // TODO Auto-generated method stub

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值