MyBatis插件实现分页

来源:互联网 发布:淘宝流量入口 编辑:程序博客网 时间:2024/04/26 13:17
1:在spring-MyBatis.xml文件中添加以下配置:




2:PageIntercepter自定义拦截器通过拦截StatementHandler重写sql语句实现对数据库的物理分页。
public Object intercept(Invocation invocation) throws Throwable {    StatementHandler statementHandler = (StatementHandler)invocation.getTarget();    MetaObject metaStatementHandler;    Object configuration;    for(metaStatementHandler = MetaObject.forObject(statementHandler, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY); metaStatementHandler.hasGetter("h"); metaStatementHandler = MetaObject.forObject(configuration, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY)) {        configuration = metaStatementHandler.getValue("h");    }    while(metaStatementHandler.hasGetter("target")) {        configuration = metaStatementHandler.getValue("target");        metaStatementHandler = MetaObject.forObject(configuration, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);    }    Configuration configuration1 = (Configuration)metaStatementHandler.getValue("delegate.configuration");    Properties properties = configuration1.getVariables();    if(properties == null) {        dialect = defaultDialect;        pageSqlId = defaultPageSqlId;    } else {        dialect = configuration1.getVariables().getProperty("dialect");        if(dialect == null || "".equals(dialect)) {            logger.warn("Property dialect is not setted,use default \'mysql\' ");            dialect = defaultDialect;        }        pageSqlId = configuration1.getVariables().getProperty("pageSqlId");        if(pageSqlId == null || "".equals(pageSqlId)) {            logger.warn("Property pageSqlId is not setted,use default \'.*Page$\' ");            pageSqlId = defaultPageSqlId;        }    }    MappedStatement mappedStatement = (MappedStatement)metaStatementHandler.getValue("delegate.mappedStatement");    if(mappedStatement.getId().matches(pageSqlId)) {        BoundSql boundSql = (BoundSql)metaStatementHandler.getValue("delegate.boundSql");        Object parameterObject = boundSql.getParameterObject();        if(parameterObject == null) {            throw new NullPointerException("parameterObject is null!");        }        PageParameter pageParameter = null;        if(parameterObject instanceof Map) {            Map sql = (Map)parameterObject;            pageParameter = (PageParameter)sql.get("pageParameter");        } else {            Field sql1 = ReflectUtil.getParentFieldByFieldName(parameterObject, "pageParameter");            if(sql1 != null) {                pageParameter = (PageParameter)ReflectUtil.getParentFieldValue(parameterObject, "pageParameter");            }        }        if(pageParameter == null) {            pageParameter = new PageParameter();        }        String sql2 = boundSql.getSql();        String pageSql = this.buildPageSql(sql2, pageParameter);        metaStatementHandler.setValue("delegate.boundSql.sql", pageSql);        metaStatementHandler.setValue("delegate.rowBounds.offset", Integer.valueOf(0));        metaStatementHandler.setValue("delegate.rowBounds.limit", Integer.valueOf(2147483647));        Connection connection = (Connection)invocation.getArgs()[0];        this.setPageParameter(sql2, connection, mappedStatement, boundSql, pageParameter);    }    return invocation.proceed();}
3:要拦截的目标类型是StatementHandler,拦截的是方法名为prepare参数为Connection的方法。
@Intercepts({@Signature(    type = StatementHandler.class,    method = "prepare",    args = {Connection.class})})
0 0
原创粉丝点击