本文实例为大家分享了完整的 Java 分页拦截类 供大家参考 , 具体内容如下
Package Com.opms.Interceptor; импорт java.sql.connection; import java.sql.preparedStatement; import java.sql.resultset; импорт java.sql.sqlexception; import java.util.properties; импорт org.apache.ibatis.executor.parameter.parameteries; org.apache.ibatis.executor.statement.statementhandler; import org.apache.ibatis.logging.log; import org.apache.ibatis.logging.logfactory; import org.apache.ibatis.mapping.boundsql; импорт org.apache.ibate.mapping.mappedStation; org.apache.ibatis.plugin.interceptor; import org.apache.ibatis.plugin.intercepts; import org.apache.ibatis.plugin.invocation; импорт org.apache.ibatis.plugin.plugin; импорт org.apache.ibatis.pluge.signature; org.apache.ibatis.reflection.factory.defaultobjectfactory; import org.apache.ibatis.reflection.factory.objectfactory; import org.apache.ibatis.reflection.wrapper.defaultobjectwrapperfactory; import org.apache.ibatis.reflection.wrapper.objectwrapperfortory; org.apache.ibatis.scripting.defaults.defaultparameterhandler; import org.apache.ibatis.session.rowbounds; импорт com.wifi.core.page.page;/** * * */@Retercepts ({@signature (type = ratementhandler.class, method = "prepare", args = {connection.class})}) открытый класс PageInterceptor реализует Interceptor {/** * 日志 */Private Static Final Logger = logFactory.getLog (pageInterceptor.class); / ** * 声明对象 */ private static final finalfactory default_object_factory = new DefaultObjectFactory (); / ** * 声明对象 */ private static final objectWrapperFactory default_object_wrapper_factory = new DefaultObjectWrapperFactory (); / ** * 数据库类型 (默认为 mysql) */ частная статическая строка defaultdialect = "mysql"; / ***需要拦截的 id (正则匹配)*/ частная статическая строка defaultpagesqlid = ".*4page $"; / ** * 数据库类型 (默认为 mysql) */ private static String dialect = ""; / ** * 需要拦截的 id (正则匹配) */ private static String pagesqlid = ""; / ** * @param inpocation 参数 * @return объект * @Throws Throwable 抛出异常 */ public Object Intercept (vocation vocation) Throws {atportionHandler athipeHandler = (ratportHandler) vlocation.getTarget (); MetaObject metaTatementHandler = metaObject.ForObject (athustHandler, default_object_factory, default_object_wrapper_factory); // 分离代理对象链 (由于目标类可能被多个拦截器拦截 , 从而形成多次代理 , 通过下面的两次循环可以分离出最原始的的目标类) while (metaTatementHandler.hasgetter ("h")) {object object = metaTatementHandler.getValue ("h"); MetaTatementHandler = metaObject.forObject (Object, default_object_factory, default_object_wrapper_factory); } // 分离最后一个代理对象的目标类 while (metaTatementHandler.hasgetter ("target")) {object object = metastatementHandler.getValue ("target"); MetaTatementHandler = metaObject.forObject (Object, default_object_factory, default_object_wrapper_factory); } dialect = defaultDialect; pagesqlid = defaultPagesQlid; /* Конфигурация конфигурации = (конфигурация) metaTatementHandler.getValue ("delegate.configuration"); dialect = configuration.getVariables (). getProperty ("Dialect"); if (null == dialect || "" .equals (dialect)) {logger.warn ("Диалект свойств не нанесен, используйте по умолчанию 'mysql'"); dialect = defaultDialect; } pagesqlid = configuration.getVariables (). getProperty ("pagesqlid"); if (null == pagesqlid || "". equals (pagesqlid)) {logger.warn ("Property Pagesqlid не нанесено, используйте по умолчанию '.*Page $'"); pagesqlid = defaultPagesQlid; }*/ MapedStatement MapedStatement = (MapedStatement) metaTatementHandler.getValue ("Delegate.MappedStatement"); // 只重写需要分页的 SQL 语句。通过 MapedStatement 的 ID 匹配 , 默认重写以 Page 结尾的 MapedStatement 的 SQL if (mapedStatement.getId (). Matches (pagesqlid)) {boundsql boundsql = (boundsql) metaTatementHandler.getValue ("delegate.boundsql"); Объект parameterObject = boundsql.getParameterObject (); if (parameterObject == null) {бросить новое NullPointerException ("ParameterObject is null!"); } else {Object obj = metaTatementHandler .getValue ("delegate.boundsql.parameterObject.page"); // 传入了 Страница 参数且需要开启分页时 if (obj! = Null && obj exancef page && ((page) obj) .ispagination ()) {page page = (page) metastementHandler .getValue ("delegate.boundsql.parameterobject.page"); String sql = boundsql.getsql (); // 重写 SQL String pagesql = buildPagesQl (SQL, Page); MetaTatementHandler.SetValue ("Delegate.boundsql.sql", Pagesql); // 采用物理分页后 , 就不需要 mybatis 的内存分页了 , 所以重置下面的两个参数 metaTatementHandler.setValue ("Delegate.RowBounds.Offset", rowbounds.no_row_offset); MetaTatementHandler.SetValue ("Delegate.RowBounds.limit", rowbounds.no_row_limit); Connection Connection = (Connection) vocation.getArgs () [0]; // 重设分页参数里的总页数等 SetPageParameter (SQL, соединение, MapedStatement, BoundsQl, Page); }}} // 将执行权交给下一个拦截器 return vlocation.proecd (); } /** * 从数据库里查询总的记录数并计算总页数,回写进分页参数<code>PageParameter</code>,这样调用者就可用通过 分页参数 * <code>PageParameter</code>获得相关信息。 * * @param sql 参数 * @param connection 连接 * @param mappedStatement 参数 * @param boundSql 绑定sql * @param page 页 */ private void setPageParameter(String sql, Connection connection, MappedStatement MapedStatement, BoundsQl Boundsql, Page Page) {// 记录总记录数 String ountsql = "Выберите count (0) из (" + sql + ") как общее"; Подготовленное Statatement countstmt = null; Результат RS = NULL; try {countstmt = connection.prepareStatement (countsql); Boundsql Countbs = new Boundsql (mapedStatement.getConfiguration (), gountsql, boundsql.getParameterMappings (), boundsql.getParameterObject ()); SetParameters (CountStmt, MapedStatement, 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 参数 (?) 设值 * * @param ps 参数 * @param mapedStatement 参数 * @param boundsql 绑定 sql * @param parameterobject 参数对象 * @throws sqlexeption 抛出 sql 异常 * / creative void setParameters (подготовленные поставки, MAVEDStatement 抛出 SQL 异常 / crivate void setParameter ParameterObject) Throws SQLexception {parameterHandler parameterHandler = new DefaultParameterHandler (MapedStatement, ParameterObject, Boundsql); ParameterHandler.SetParameters (PS); } / ** * 根据数据库类型 , 生成特定的分页 sql * * @param sql 餐宿 * @param page 页 * @return String * / private String buildpagesql (String sql, page page) {if (page! = Null) {stringBuilder pagesql = new StringBuilder (); if ("mysql" .equals (dialect)) {pagesql = buildpagesqlformysql (sql, page); } else if ("oracle" .equals (dialect)) {pagesql = buildPagesQlFororacle (sql, page); } else {return sql; } return pagesql.toString (); } else {return sql; }} / ** * mysql 的分页语句 * * @param sql 参数 * @param page 页 * @return String * / public StringBuilder buildPagesQlFormySQL (String SQL, страница Page) {StringBuilder pagesql = new StringBuilder (100); String beginrow = string.valueof ((page.getCurpage () - 1) * page.getPagesize ()); pagesql.append (sql); pagesql.append ("Limit" + beginrow + "," + page.getPagesize ()); вернуть pagesql; } / ** * 参考 hibernate 的实现完成 Oracle 的分页 * * @param sql 参数 * @param Page 参数 * @return String * / public StringBuilder buildPagesQlFororAcle (String SQL, страница страницы) {StringBuilder PAGESQL = new StringBuilder (100); 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 из ("); pagesql.append (sql); pagesql.append (") temp, где rownum <=") .append (endrow); pagesql.append ("), где row_id>") .append (beginrow); вернуть pagesql; } / ** * @param target 参数 * @return объект * / public Object Plugin (объект Target) {// 当目标类是 antagehandler 类型时 , 才包装目标类 , 否者直接返回目标本身 否者直接返回目标本身 减少目标被代理的次数 if (target ancomefationhandler) {return plugin.wrap (target, this); } else {return target; }} / ** * @param Свойства 参数 * / public void setProperties (свойства свойств) {}}以上就是本文的全部内容 , 希望对大家的学习有所帮助 也希望大家多多支持武林网。