本文实例为大家分享了完整的 Java 分页拦截类 , 供大家参考 , 具体内容如下
package com.opms.Interceptor ؛ استيراد java.sql.connection ؛ استيراد java.sql.preparedstatement ؛ استيراد java.sql.resultset ؛ استيراد java.sql.sqlexception org.apache.ibatis.executor.statement.statementHandler ؛ import org.apache.ibatis.logging.log ؛ import org.apache.ibatis.logging.logfactory ؛ import org.apache.ibatis.mapping.boundsql ؛ import org.apach.ibatis.mapping.mapping.mapped ؛ org.apache.ibatis.plugin.Interceptor ؛ import org.apache.ibatis.plugin.Intercepts ؛ import org.apache.ibatis.plugin.invocation ؛ import org.apache.ibatis.plugin org.apache.ibatis.reflection.factory.defaultObjectFactory ؛ import org.apache.ibatis.reflection.factory.objectorfactory ؛ import org.apache.ibatis.reflection.wrapper.wefaultObjectWrapperFactory ؛ org.apache.ibatis.scripting.defaults.defaultparameterHandler ؛ import org.apache.ibatis.session.rowbounds ؛ import com.wifi.core.page.page ؛/** * 通过拦截 <code> statement statement 湖畔微风 湖畔微风 湖畔微风*/@intercepts ({@signature (type = stateHandler.class ، method = "prepared" ، args = {connection.class})}) Public Class PageInterceptor Precose interceptor {/** *日志 */private static final logger = logfactory.getlog (pageInterceptor.class) ؛ / ** * 声明对象 */ private static final ObjectFAUTALT_OBJECT_FACTORY = جديد defaultObjectFactory () ؛ / ** * 声明对象 */ private static final ObjectWrapperFactory default_object_wrapper_factory = new DefaultObjectWrapperFactory () ؛ / ** * 数据库类型 (默认为 mysql) */ سلسلة ثابتة خاصة defaultDialect = "mysql" ؛ / ***需要拦截的 id (正则匹配)*/ private Static String DefaultPagesQlid = ".*4 page $" ؛ / ** * 数据库类型 (默认为 mysql) */ private static string dialect = "" ؛ / ** * 需要拦截的 id (正则匹配) */ private pageqlid = "" ؛ / ** * param invocation 参数 * robject * @throws قابلة للتسمية 抛出异常 */ اعتراض الكائن العام (استدعاء الاستدعاء) رمي {stitplehandler stitpller = (stitptHandler) invocation.getTarget () ؛ metaObject MetastatementHandler = metaObject.foroBject (stitpleler ، default_object_factory ، default_object_wrapper_factory) ؛ // 分离代理对象链 (由于目标类可能被多个拦截器拦截 , 从而形成多次代理 , 通过下面的两次循环可以分离出最原始的的目标类) بينما (metastatementHandler.hasgetter ("H")) {object = metastatementHandler.getValue ("H") ؛ metastatementHandler = metaObject.foroBject (كائن ، default_object_factory ، default_object_wrapper_factory) ؛ } // 分离最后一个代理对象的目标类 بينما (metastatementHandler.hasgetter ("Target")) {Object = metastatementHandler.getValue ("Target") ؛ metastatementHandler = metaObject.foroBject (كائن ، default_object_factory ، default_object_wrapper_factory) ؛ } لهجة = defaultDialect ؛ pagesqlid = defaultPagesQlid ؛ /* تكوين التكوين = (التكوين) metastateMentHandler.getValue ("DevIt.Configuration") ؛ لهجة = configuration.getVariables (). if (null == dialect || "" .equals (dialect)) {logger.warn ("لم يتم تعيين لهجة الخاصية ، استخدم" mysql '") ؛ لهجة = defaultDialect ؛ } pagesqlid = configuration.getVariables (). getProperty ("pagesqlid") ؛ if (null == pageqlid || "" .equals (pagesqlid)) {logger.warn ("pagesqlid لم يتم تعيينه ، استخدم الافتراضي".*الصفحة $ '") ؛ pagesqlid = defaultpagesqlid ؛ }*/ mappedStatement medpedStatement = (mappedStatement) metastateMentHandler.getValue ("depegate.mappedStatement") ؛ // 只重写需要分页的 sql 语句。通过 mapPedStatement 的 的 匹配 , 默认重写以 page 结尾的 mappedStateMent 的 sql if (medpedStatement.getId (). matches (pagesqlid)) {boundsql boundsql = (BODEDSQL) MELTASTATEMANTHENDLER.GETVALUE ( parameterObject = boundsql.getParameterObject () ؛ if (parameterObject == NULL) {رمي nullpointerxception جديد ("parameterObject is null!") ؛ } آخر {object obj = metastatementHandler .getValue ("devate.boundsql.parameterObject.page") ؛ // 传入了 page 参数且需要开启分页时 if (obj! = null && obj pageof page && ((page) obj) .ispagination ()) {page page = (page) metastateMentHandler .getValue ("devate.boundsql.parameterobject.page") ؛ String sql = boundsql.getsql () ؛ // 重写 SQL String PageSql = BuildPagesQl (SQL ، Page) ؛ metastatementHandler.setValue ("depegate.boundsql.sql" ، pagesql) ؛ // 采用物理分页后 , 就不需要 mybatis 的内存分页了 , 所以重置下面的两个参数 metastatementhandler.setValue ("depegate.rowbounds.offset" ، rowbounds.no_row_offset) ؛ metastatementHandler.setValue ("depegate.rowbounds.limit" ، rowbounds.no_row_limit) ؛ اتصال الاتصال = (اتصال) invocation.getargs () [0] ؛ // 重设分页参数里的总页数等 setPageParameter (SQL ، Connection ، MedpedStatement ، Boundsql ، page) ؛ }}} // 将执行权交给下一个拦截器 return invocation.proceed () ؛ }/** * 从数据库里查询总的记录数并计算总页数 , 回写进分页参数 <code> pageParameter </code> ، 这样调用者就可用通过 分页参数 * <code> pageParameter </code> MedpedStatement ، BONDSQL BOODSQL ، صفحة الصفحة) {// 记录总记录数 countsql = "SELECT COUNT (0) من (" + sql + ") على أنها إجمالية" ؛ reparedStatement countStmt = null ؛ resultset rs = null ؛ حاول {countStmt = connection.preparestatement (countsql) ؛ countbs boundsql = new BONDSQL (MEPTSTATEMTEMTEMTEMNED.GETCONFIGURATION () ، COUNTSQL ، BONDSQL.GetParamEterMappings () ، BONDSQL.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) ؛ } حاول {countStmt.Close () ؛ } catch (sqlexception e) {logger.error ("تجاهل هذا الاستثناء" ، e) ؛ ستر parameterObject) يلقي sqlexception {parametherHandlerlerler = new DefaultParameterHandler (mappedStatement ، parameterObject ، boundsql) ؛ parameterHandler.setParameters (PS) ؛ } / ** * 根据数据库类型 , 生成特定的分页 sql * * param sql 餐宿 * param page 页 * @regurn string * / private string buildpagesql (String sql ، page page) {if (page! = null) {StringBuilder pagesql = new StringBuilder () ؛ إذا ("mysql" .equals (لهجة)) {pagesql = buildpagesqlFormySql (sql ، page) ؛ } آخر إذا ("oracle" .equals (لهجة)) {pagesql = buildpagesqlfororacle (sql ، page) ؛ } آخر {return sql ؛ } return pagesql.toString () ؛ } آخر {return sql ؛ }} / ** * mysql 的分页语句 * * param sql 参数 * param page 页 * regurn string * / public stringBuilder buildpagesqlformysql (سلسلة sql ، صفحة الصفحة) {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 (سلسلة SQL ، صفحة الصفحة) 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 <=") .Append (endrow) ؛ pagesql.append (") where_id>"). إرجاع pagesql ؛ } / ** * @param target 参数 * @regurn كائن * / الكائن العام المكوّن الإضافي (هدف الكائن) {// 当目标类是 statehHandler 类型时 才包装目标类 , 否者直接返回目标本身 否者直接返回目标本身 ، 减少目标被代理的次数 if (target statehandler) {return plugin.wrap (target ، this) ؛ } آخر {return target ؛ }} / ** * param properties 参数 * / public void setProperties (خصائص الخصائص) {}}以上就是本文的全部内容 , 希望对大家的学习有所帮助 , 也希望大家多多支持武林网。