本文实例为大家分享了完整的 Java 分页拦截类 , 供大家参考 , 具体内容如下
Paket com.opms.Interceptor; import Java.sql.Connection; Import Java.sql.PrepararedStatement; Import Java.SQL.Resultset; Import Java.sql.sqlexception; org.apache.ibatis.executor.statement.statementHandler; import org.apache.ibatis.logging.log; import org.apache.ibatis.logging org.apache.ibatis.plugin.interceptor; import org.apache.ibatis.plugin.intercepts; org.apache.ibatis.plugin.invocation; import org.apache.ibatis.plugin.plugin; org.apache.ibatis.reflection.factory.DefaultObjectFactory; import org.apache.ibatis.reflection.factory.objectory; org.apache.ibatis.Scripting.Defaults.DefaultParameterHandler; import org.apache.ibatis.Session.Rewbounds; */@Intercepts ({@Signature (type = ansageHandler.class, method = "prepe", args = {connection.class})}) public class pageInterceptor implementiert interceptor {/** *日志 */private statische endgültige log -logger = logfactory.getory.class (pageInterceptor.classe); / ** * 声明对象 */ private statische endgültige Objektfaktory default_object_factory = new DefaultObjectFactory (); / ** * 声明对象 */ private statische endgültige ObjectWrapperFactory default_object_wrapper_factory = new DefaultObjectWrapperFactory (); / ** * 数据库类型 (默认为 mysql) */ private statische String defaultDialect = "mySQL"; / ***需要拦截的 id (正则匹配)*/ private statische Zeichenfolge defaultPagesqlid = ".*4page $"; / ** * 数据库类型 (默认为 mysql) */ private statische String -Dialekt = ""; / ** * 需要拦截的 id (正则匹配) */ private statische String pagesqlid = ""; / ** * @Param Incialocation 参数 * @return Object * @throws Throwable 抛出异常 */ public Object Intercept (Invocation Invocation) löscht Throwable {StatementHandler AnweisungHandler = (StatementHandler) Invocation.gettArget (); MetaObject metastatementHandler = metaObject.forObject (AnweisungHandler, default_object_factory, default_object_wrapper_factory); // 分离代理对象链 (由于目标类可能被多个拦截器拦截 , 从而形成多次代理 , 通过下面的两次循环可以分离出最原始的的目标类 通过下面的两次循环可以分离出最原始的的目标类 通过下面的两次循环可以分离出最原始的的目标类 通过下面的两次循环可以分离出最原始的的目标类 通过下面的两次循环可以分离出最原始的的目标类 通过下面的两次循环可以分离出最原始的的目标类 通过下面的两次循环可以分离出最原始的的目标类) (metastatementHandler.hasger ("H")) {Object Object = metastatementHandler.getValue ("H"); metastatementHandler = metaObject.forObject (Objekt, default_object_factory, default_object_wrapper_factory); } // 分离最后一个代理对象的目标类 while (metastatementHandler.hasgertter ("Ziel") {Object Object = metastatementHandler.getValue ("Ziel"); metastatementHandler = metaObject.forObject (Objekt, default_object_factory, default_object_wrapper_factory); } Dialect = defaultDialect; pagesqlid = defaultPagesqlid; /* Configuration configuration = (configuration) metastatementHandler.getValue ("delegate.configuration"); Dialect = configuration.getVariables (). getProperty ("Dialekt"); if (null == Dialekt || "" .Equals (Dialekt)) {logger.warn ("Eigenschaftsdialekt ist nicht eingestellt, verwenden Sie Standard 'mySQL'"); Dialect = defaultDialect; } pagesqlid = configuration.getVariables (). getProperty ("Pagesqlid"); if (null == PAGESQLID || "" .Equals (pagesqlid)) {logger.warn ("Eigenschaften pagesqlid ist nicht festgelegt, verwenden Sie Standard '.*Seite $'"); PAGESQLID = defaultPagesqlid; }*/ MADPDStatement MADPDStatement = (MADPDStatement) metastatementHandler.getValue ("delegate.mappedStatement"); // 只重写需要分页的 sql 语句。通过 kartierstatement 的 id 匹配 , 默认重写以 默认重写以 结尾的 kartierstatement 的 sql if (mapPedStatement.getId (). Übereinstimmungen (pagesqlid)) {boundsql boundsql = (bandsql) metastatementHandler.getValue ("delegate.bobundSQL"); Object ParameterObject = bodernsql.getParameterObject (); if (parameterObject == null) {werfen neuer nullpointerexception ("parameterObject is null!"); } else {Object obj = metastatementHandler .getValue ("delegate.boundsql.parameterObject.page"); // 传入了 Seite 参数且需要开启分页时 if (obj! String sql = bodensql.getSQL (); // 重写 SQL String pagesql = BuildPagesql (SQL, Seite); 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 Connection = (Verbindung) Invocation.getargs () [0]; // 重设分页参数里的总页数等 setPageParameter (SQL, Verbindung, Kartentatement, boundSQL, Seite); }}} // 将执行权交给下一个拦截器 return Invocation.Procece (); } /** * 从数据库里查询总的记录数并计算总页数,回写进分页参数<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 kartierstatement, boundSQL boundSQL, Seite Seite) {// 记录总记录数 String countSQL = "Wählen Sie count (0) aus (" + sql + ") als Gesamt"; PrepedStatement countstmt = null; ResultSet rs = null; try {countstmt = connection.preparestatement (countSQL); BodernSQL countbs = new boundSQL (MapChdStatement.getConfiguration (), countSQL, boundSQL.getParameterMappings (), boundsql.getParameterObject ()); setParameters (countstmt, kartierstatement, countbs, bodersql.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 ("Ignorieren Sie diese Ausnahme", e); } endlich {try {rs.close (); } catch (sqlexception e) {logger.Error ("Ignorieren Sie diese Ausnahme", e); } try {countstmt.close (); } catch (sqlexception e) {logger.Error ("Ignorieren Sie diese Ausnahme", e); } } } /** * 对SQL参数(?)设值 * * @param ps 参数 * @param mappedStatement 参数 * @param boundSql 绑定sql * @param parameterObject 参数对象 * @throws SQLException 抛出sql异常 */ private void setParameters(PreparedStatement ps, MappedStatement mappedStatement, BoundSql boundSql, Object ParameterObject) löst SQLEXception {parameterHandler parameterHandler = new DefaultParameterHandler (kartierstatement, parameterObject, bodernSQL) aus; ParameterHandler.SetParameters (PS); } / ** * 根据数据库类型 , 生成特定的分页 SQL * * @param SQL 餐宿 * @param Seite 页 * @return String * / private string buildpagesql (String sql, Seite Seite) {if (Seite! if ("mysql" .equals (Dialekt)) {pagesql = buildPagesQlFormysql (SQL, Seite); } else if ("oracle" .equals (Dialekt)) {pagesql = buildPagesQlfororacle (SQL, Seite); } else {return SQL; } return pagesql.toString (); } else {return SQL; }} / ** * mysql 的分页语句 * * @param sql 参数 * @param Seite 页 * @return String * / public StringBuilder BuildPagesQlFormysql (String SQL, Seite Seite) {StringBuilder pagesql = new StringBuilder (100); String beginRow = string.ValueOf (((page.getCurPage () - 1) * Page.getPageSize ()); PAGESQL.Append (SQL); PAGESQL.Append ("Limit" + beginrow + "," + page.getPageSize ()); Rückgabe pagesql; } / ** * 参考 hibernate 的实现完成 oracle 的分页 * * @param sql 参数 * @param Seite 参数 * @return String * / public StringBuilder Buildpagesqlfororacle (String SQL, Seite Seite) {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 * aus (SELECT TEMP. *, ROWNUM row_id von ("); Pagesql.append (SQL); pagesql.append (") tempo wob Rückgabe pagesql; } / ** * @param target 参数 * @return Object * / public Object -Plugin (Objektziel) {// 当目标类是 当目标类是 当目标类是 当目标类是 当目标类是 当目标类是 当目标类是 当目标类是 当目标类是 类型时 类型时 , 才包装目标类 , 否者直接返回目标本身, 减少目标被代理的次数 if (Zielinstanz von AnweisungHandler) {return plugin.wrap (target, this); } else {return target; }} / ** * @param Eigenschaften 参数 * / public void setProperties (Eigenschaften Eigenschaften) {}}以上就是本文的全部内容 , 希望对大家的学习有所帮助 , 也希望大家多多支持武林网。 也希望大家多多支持武林网。