本文实例为大家分享了完整的java分页拦截类、供大家参考、具体内容如下
パッケージcom.opms.interceptor; import java.sql.connection; import java.sql.preparedStatement; import java.sql.Resultset; Import java.sql.sqlecception; import java.util.properties; import org.apache.ibatis Org.apache.ibatis.statement.statementhandler; import org.apache.ibatis.logging.log; Import org.apache.ibatis.logging.logfactory; import org.apache.ibatis.mapping.boundsql; Import org.apache.ibatis.mapping.mapping.mapping.mapping. org.apache.ibatis.plugin.interceptor; Import org.apache.ibatis.plugin.intercepts; Import org.apache.ibatis.plugin.invocation; Import org.apache.ibatis.plugin; plugin; Import org.apache.ibatis.plugin.plugin.signature; imptigrection. apache.ibatis.factory.factory.defaultobjectfactory; Import org.apache.ibatis.Reflection.factory.objectfactory; Import org.apache.ibatis.Reflection.wrapper.DefaultObjectWrapperFactory; Import org.apache.ibatis.Reftion.Wrapper.Butrapperfuterfuterfuterfuterfuterfuterfuterfuterfuterfuter org.apache.ibatis.scripting.defaults.defaultparameterhandler; Import org.apache.ibatis.session.Rowbounds; Import com.wifi.core.page.page;/** * */@intercepts({@signature(type = statementhandler.class、method = "prepare"、args = {connection.class})})パブリッククラスページインターセプターインターセプター{/** *日志 */private static final logger = logactory.getlog(pageinterceptor.class); / ** *声明对象 */ private static final objectoryfactory default_object_factory = new DefaultObjectFactory(); / ** *声明对象 */ private static final objectwrapperfactory default_object_wrapper_factory = new DefaultObjectWrapperFactory(); / ** *数据库类型(默认为mysql) */ private static string defaultdialect = "mysql"; / ***需要拦截的id(正则匹配)*/ private static string defaultpagesqlid = "。*4page $"; / ** *数据库类型(默认为mysql) */ private static string dialect = ""; / ** *需要拦截的id(正则匹配) */ private static string pagesqlid = ""; / ** * @param Invocation参数 * @return Object * @Throws Throwable抛出异常 */ public Object Intercept(Invocation Invocation)Throws {StatementHandler StatementHandler =(StatementHandler)Invocation.getTarget(); MetaObject MetastatementHandler = MetaObject.Forobject(StatementHandler、default_object_factory、default_object_wrapper_factory); //分离代理对象链(由于目标类可能被多个拦截器拦截、从而形成多次代理、从而形成多次代理、通过下面的两次循环可以分离出最原始的的目标类)while(metastatementhandler.hasgetter( "h")){object object = metastatementhandler.getValue( "h"); metastatementhandler = metaobject.forobject(object、default_object_factory、default_object_wrapper_factory); } //分离最后一个代理对象的目标类while(metastatementhandler.hasgetter( "ターゲット")){object object = metastatementhandler.getValue( "ターゲット"); metastatementhandler = metaobject.forobject(object、default_object_factory、default_object_wrapper_factory); } dierect = defaultdialect; pagesqlid = defaultpagesqlid; /* configuration configuration =(configuration)metastatementhandler.getValue( "Delegate.Configuration");方言= configuration.getVariables()。getProperty( "方言"); if(null ==方言|| "" .equals(方言)){logger.warn( "プロパティ方言は設定されていない、デフォルトの 'mysql'");方言= defaultDialect; } pagesqlid = configuration.getVariables()。getProperty( "pagesqlid"); if(null == pagesqlid || "" .equals(pagesqlid)){logger.warn( "Property pagesQlidは設定されていません。 pagesQlid = defaultPagesQlid; }*/ mappedStatement mappedStatement =(mappedstatement)metastatementhandler.getValue( "Delegate.Mapptatement"); //只重写需要分页的sql mappedStatement object parameterObject = bundsql.getParameterObject(); if(parameterObject == null){nullPointerExceptionをスロー( "parameterObject is null!"); } else {object obj = metastatementhandler .getValue( "Delegate.BoundSQL.ParameterObject.Page"); // page参数且需要开启分页时if(obj!= null && obj instanceof page &&((page)obj).ispagination()){page page =(page)metastatementhandler .getvalue( "delegate.boundsql.parameterobject.page");文字列sql = bundsql.getsql(); // metastatementhandler.setValue( "Delegate.BoundSQL.SQL"、PagesQl); //采用物理分页后、就不需要mybatis的内存分页了、所以重置下面的两个参数metastatementhandler.setValue( "Delegate.RowBounds.Offset"、RowBounds.no_Row_offset); metastatementhandler.setValue( "Delegate.RowBounds.limit"、rowbounds.no_row_limit);接続接続=(connection)rikocation.getargs()[0]; // setPageParameter(SQL、Connection、MappedStatement、BoundSQL、Page); }}} // }/** *从数据库里查询总的记录数并计算总页数、回写进分页参数<code> pageparameter </code>、这样调用者就可用通过 * <code> pageparameter </code>获得相关信息。 * * @param sql参数 * @param connection连接 * @param mappedstatement MappedStatement、BundsQl BoundsQl、ページページ){// preatedStatement countStmt = null;結果rs = null; try {countstmt = connection.preparestatement(countSQL); Boundsql countbs = new BoundSql(MappedStatement.GetConfiguration()、CountSQL、BundsQl.GetParameterMappings()、Bundsql.getParameterObject()); setParameters(countStmt、MappedStatement、countbs、Boundsql.getParameterObject()); rs = countstmt.executequery(); int totalcount = 0; if(rs.next()){totalcount = rs.getint(1); } page.settotalcount(totalcount); page.init(page.getCurpage()、page.getPagesize()、totalcount); } catch(sqlexception e){logger.error( "この例外を無視する"、e); }最後に{try {rs.close(); } catch(sqlexception e){logger.error( "この例外を無視する"、e); } try {countstmt.close(); } catch(sqlexception e){logger.error( "この例外を無視する"、e); }}} / ** *对sql参数(?)设值 * * @paramps参数 * @param mappedstatement bundsql、object parameterobject)sqlexception {parameterhandler parameterhandler = new DefaultParameterHandler(MappedStatement、ParameterObject、BoundSQL); parameterHandler.setParameters(PS); } / ** *根据数据库类型、生成特定的分页sql * * @param sql if( "mysql" .equals(方言)){pagesql = buildpagesqlformysql(sql、page); } else if( "oracle" .equals(方言)){pagesql = buildpagesqlfororacle(sql、page); } else {return sql; } pagesql.toString()を返します。 } else {return sql; }} / ** * mysql string beginrow = string.valueof((page.getcurpage() - 1) * page.getPagesize()); PagesQl.Append(SQL); pagesql.append( "lime" + beginrow + "、" + page.getPagesize()); PagesQlを返します。 } / ** * hibernate string beginrow = string.valueof((page.getcurpage() - 1) * page.getPagesize()); string endrow = string.valueof(page.getCurpage() * page.getPagesize()); pagesql.append( "select * from(select temp。 *、rownum row_id from("); pagesql.append(sql); pagesql.append( ")temp where rownum <=")。(endrow); pagesql.append( ")where row_id>")。(bintrow); PagesQlを返します。 } / ** * @Param Target参数 * @return Object * / public Object Plugin(Object Target){//当目标类是statementhandler类型时、才包装目标类、否者直接返回目标本身、减少目标被代理的次数if(ターゲットInstanceof statenthandler){return plugin.wrap(target、this); } else {return target; }} / ** * @param Properties以上就是本文的全部内容、希望对大家的学习有所帮助、也希望大家多多支持武林网。