本文实例为大家分享了完整的 Java 分页拦截类, 供大家参考, 具体内容如下
แพ็คเกจ com.opms.interceptor; นำเข้า java.sql.connection; นำเข้า java.sql.preparedStatement; นำเข้า java.sql.resultset; นำเข้า java.sql.sqlexception; นำเข้า java.util.properties org.apache.ibatis.executor.statement.statementhandler; นำเข้า org.apache.ibatis.logging.log; นำเข้า org.apache.ibatis.logging.logfactory; นำเข้า org.apache.ibatis.mapping.boundsql; org.apache.ibatis.plugin.interceptor; นำเข้า org.apache.ibatis.plugin.intercepts; นำเข้า org.apache.ibatis.plugin.invocation; นำเข้า org.apache.ibatis.plugin.plugin; org.apache.ibatis.reflection.factory.defaultObjectFactory; นำเข้า org.apache.ibatis.reflection.factory.objectFactory; นำเข้า org.apache.ibatis.reflection.wrapper.defaultobjectwrapperfactory; org.apache.ibatis.scripting.defaults.defaultparameterhandler นำเข้า org.apache.ibatis.session.rowbounds; นำเข้า com.wifi.core.page.page;/** * 通过拦截 <code> 通过拦截通过拦截 <code> */@intercepts ({@signature (type = stementhandler.class, method = "เตรียม", args = {connection.class})}) คลาสสาธารณะ PageInceptor ใช้การสกัดกั้น {/** *日志 */ส่วนตัวบันทึกสุดท้าย logger = logFactory.getLog / ** * 声明对象 */ ส่วนตัวแบบคงที่วัตถุสุดท้าย default_object_factory = ใหม่ defaultObjectFactory (); / ** * 声明对象 */ ส่วนตัวแบบคงที่ objectWrapperFactory default_object_wrapper_factory = ใหม่ defaultObjectWrapperFactory (); / ** * 数据库类型 (默认为 mysql) */ สตริงคงที่ส่วนตัว defaultDialect = "mysql"; / ***需要拦截的 id (正则匹配)*/ สตริงคงที่ส่วนตัว defaultPagesQlid = ".*4PAGE $"; / ** * 数据库类型 (默认为 mysql) */ ภาษาสตริงคงที่ส่วนตัว = ""; / ** * 需要拦截的 id (正则匹配) */ สตริงคงที่ส่วนตัว pagesqlid = ""; / ** * @param Invocation 参数 * @return Object * @throws trowable 抛出异常 */ การสกัดกั้นวัตถุสาธารณะ (การเรียกร้องการเรียกใช้) โยน throwable {staomitionalhandler attementlerhandler = (คำสั่ง handler) rachation.getTarget (); MetaObject metastatementhandler = metaobject.forobject (คำสั่ง handler, default_object_factory, default_object_wrapper_factory); // 分离代理对象链 (由于目标类可能被多个拦截器拦截, 从而形成多次代理, 通过下面的两次循环可以分离出最原始的的目标类) ในขณะที่ (MetastatementHandler.hasgetter ("H")) {Object Object = MetastatementHandler.getValue ("H"); MetastatementHandler = metaobject.forobject (วัตถุ, default_object_factory, default_object_wrapper_factory); } // 分离最后一个代理对象的目标类ในขณะที่ (MetastatementHandler.hasgetter ("เป้าหมาย")) {Object Object = MetastatementHandler.getValue ("เป้าหมาย"); MetastatementHandler = metaobject.forobject (วัตถุ, default_object_factory, default_object_wrapper_factory); } Dialect = defaultDialect; pagesQlid = defaultPagesQLID; /* การกำหนดค่าการกำหนดค่า = (การกำหนดค่า) MetastatementHandler.getValue ("Delegate.Configuration"); Dialect = configuration.getVariables (). getProperty ("ภาษา"); if (null == Dialect || "" .equals (ภาษาถิ่น)) {logger.warn ("ภาษาถิ่นที่อยู่ไม่ได้ตั้งค่าให้ใช้ 'mysql' เริ่มต้น '"); ภาษาถิ่น = defaultDialect; } pagesQLID = configuration.gAtVariables (). getProperty ("pageSqlid"); if (null == PagesQlid || "" .equals (PagesQLID)) {logger.warn ("คุณสมบัติ PagePagesQLID ไม่ได้ตั้งค่าใช้เงินเริ่มต้น '.*หน้า $'"); PagesQLid = defaultPagesQLid; }*/ MappedStatement MappedStatement = (MappedStatement) MetastatementHandler.getValue ("Delegate.mappedStatement"); // 只重写需要分页的 SQL 语句。通过 MappedStatement 的 id 匹配, 默认重写以 page 结尾的 MappedStatement 的 SQL ถ้า (MappedStatement.getId (). Matches (PagesQlid)) {Boundsql Boundsql = (BoundsQl) การแพร่กระจาย พารามิเตอร์ Object = BoundSql.GetParameterObject (); if (parameterObject == null) {โยน nullpointerexception ใหม่ ("parameterObject เป็น null!"); } else {object obj = metastatementhandler .getValue ("Delegate.boundsql.parameterobject.page"); // 传入了หน้า参数且需要开启分页时ถ้า (obj! = null && obj อินสแตนซ์ของหน้า && ((หน้า) obj) .ispagination ()) {หน้าหน้า = (หน้า) metastatementhandler .getValue ("delegate.boundsql.parameterobject.page"); String sql = boundsql.getsql (); // 重写 SQL String PageSql = buildPagesQl (SQL, หน้า); 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); การเชื่อมต่อการเชื่อมต่อ = (การเชื่อมต่อ) ravecocation.getArgs () [0]; // 重设分页参数里的总页数等 SetPageParameter (SQL, การเชื่อมต่อ, MappedStatement, BoundSQL, หน้า); }}} // 将执行权交给下一个拦截器 return invocation.proceed (); }/** * 从数据库里查询总的记录数并计算总页数, 回写进分页参数 <code> pageparameter </code>, 这样调用者就可用通过分页参数 * <code> pageparameter </code> 获得相关信息。 * * @param sql 参数 * @param การเชื่อมต่อ连接 * @param mappedstatement 参数 * @param boundsql 绑定 sql * @param page MappedStatement MappedStatement, BoundSQL BoundSQL, หน้าหน้า) {// 记录总记录数สตริง countsql = "เลือกนับ (0) จาก (" + sql + ") ทั้งหมด"; PreparedStatement CountStmt = NULL; ผลลัพธ์ RS = NULL; ลอง {countStmt = connection.prepareStatement (countsql); BoundSQL COUNTBS = New BoundSQL (MappedStatement.getConfiguration (), CountsQl, BoundSQL.GetParameterMappings (), BoundSQL.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); } ในที่สุด {ลอง {rs.close (); } catch (sqlexception e) {logger.error ("ละเว้นข้อยกเว้นนี้", e); } ลอง {countstmt.close (); } catch (sqlexception e) {logger.error ("ละเว้นข้อยกเว้นนี้", e); }}} / ** * 对 sql 参数 (?) 设值 * * @param ps 参数 * @param mappedstatement 参数 * @param boundsql 绑定 sql * @param parameterobject 参数对象 * @throws sqlexception 抛出 sql 异常 * / ส่วนตัว BoundSQL, พารามิเตอร์ Object) พ่น sqlexception {parameterHandler parameterHandler = ใหม่ DefaultParameterHandler (MappedStatement, ParameterObject, BoundSQL); ParameterHandler.SetParameters (PS); } / ** * 根据数据库类型, 生成特定的分页 sql * * @param sql 餐宿 * @param page 页 * @@Return string * / สตริงส่วนตัว buildpagesql (สตริง sql หน้าหน้า) {ถ้า (หน้า! = null) if ("MySQL" .Equals (ภาษาถิ่น)) {pageSQL = buildPagesQlFormysql (sql, page); } อื่นถ้า ("Oracle" .equals (ภาษาถิ่น)) {pagesQl = buildPagesQlFororacle (SQL, หน้า); } else {return sql; } return pagesql.toString (); } else {return sql; }} / ** * mysql 的分页语句 * * @param sql 参数 * @param หน้า页 * @return string * / public Stringbuilder buildPagesQlFormysql (สตริง SQL หน้าหน้า) {StringBuilder PagesQl = สตริงใหม่ (100); String artrow = string.valueof ((page.getCurpage () - 1) * page.getPagesize ()); PagesQl.Append (SQL); PagesQl.Append ("Limit" + starnrow + "," + page.getPagesize ()); ส่งคืน pagesql; } / ** * 参考ไฮเบอร์เนต的实现完成 Oracle 的分页 * * @param sql 参数 * @param หน้า参数 * @@Return String * / Public StringBuilder BuildPagesQlFororacle (สตริง SQL หน้า) String artrow = string.valueof ((page.getCurpage () - 1) * page.getPagesize ()); string endrow = string.valueof (page.getCurpage () * page.getPagesize ()); pagesql.append ("เลือก * จาก (เลือกอุณหภูมิ *, rownum row_id จาก ("); pagesql.append (sql); pagesql.append (") อุณหภูมิที่ rownum <=") .append (endrow); pagesql.append (") ส่งคืน pagesql; } / ** * @param เป้าหมาย参数 * @return Object * / ปลั๊กอินวัตถุสาธารณะ (เป้าหมายวัตถุ) {// 当目标类是当目标类是当目标类是当目标类是当目标类是,, 才包装目标类, 否者直接返回目标本身否者直接返回目标本身, 减少目标被代理的次数ถ้า (เป้าหมายอินสแตนซ์ของคำสั่ง handler) {return plugin.wrap } else {return target; }} / ** * @param คุณสมบัติ参数 * / โมฆะสาธารณะ setProperties (คุณสมบัติคุณสมบัติ) {}}以上就是本文的全部内容, 希望对大家的学习有所帮助, 也希望大家多多支持武林网。