本文实例为大家分享了完整的 Java a, 供大家参考, 具体内容如下
패키지 com.opms.interceptor; import java.sql.connection; import java.sql.preparedStatement; import java.sql.resultset; import java.sql.sqlexception; import java.util.properties; import org.apache.ibatis.executor.parametarameter.parameternler; 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.apache.ibatis.mappping.mapppingstatement; 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.signature; import org.pache.ibat org.apache.ibatis.reflection.factory.defaultObjectFactory; import org.apache.ibatis.reflection.factory.objectFactory; import org.apache.ibatis.reflection.wrapper.defaultObprapperFactory; import org.apache.ibatis.wleptect.wwrpperwwrapplory.objapperfactory; import; import; org.apache.ibatis.scripting.defaults.defaultparameterhandler; import org.apache.ibatis.session.rowbounds; import com.wifi.core.page.page;/** * <code> statehandler </code> <code> 方法 方法 * * * * * * @aitor 湖畔微风 * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ a 重写 * @ * 语句实现物理分页。 * @ * 语句实现物理分页。 * 语句实现物理分页。 * 语句实现物理分页。 * 语句实现物理分页。 * * 签名里要拦截的类型只能是接口。 * * 签名里要拦截的类型只能是接口。 * 语句实现物理分页。 * * 签名里要拦截的类型只能是接口。 * * 语句实现物理分页。 * * 语句实现物理分页。 * * 语句实现物理分页。 * * 语句实现物理分页。 * * 语句实现物理分页。 * * 语句实现物理分页。 * * 语句实现物理分页。 * * <코드. */@intercepts ({@signature (type = stationhandler.class, method = "repary", args = {connection.class}}) public class pageinterceptor implements interceptor {/** *日志 */private static final logger = logfactory.getLog (pageInterceptor.class); / ** * 声明对象 */ private static final objectory default_object_factory = new defaultObjectFactory (); / ** * 声明对象 */ private static 최종 ObjectWrapperFactory default_object_wrapper_factory = 새로운 DefaultObjectWrapperFactory (); / ** * 数据库类型 (默认为 mysql) */ private static string defaultDialect = "mysql"; / ***需要拦截的 id (正则匹配)*/ 개인 정적 문자열 defaultPagesqlid = ".*4Page $"; / ** * 数据库类型 (默认为 mysql) */ private static string dialect = ""; / ** * 需要拦截的 id (正则匹配) */ 개인 정적 문자열 pagesqlid = ""; / ** * @param invocation 参数 * @return object * @Throws Throwable 抛出异常 */ public 객체 인터셉트 (호출) 던질 가능 {stateHandler stateHandler = (stateHandler) lenoct.getTarget (); MetaObject metastatementHandler = metaObject.forObject (stateHandler, default_object_factory, default_object_wrapper_factory); // 分离代理对象链 (分离代理对象链 分离代理对象链, 从而形成多次代理, 通过下面的两次循环可以分离出最原始的的目标类) while (metastatementHandler.hasgetter ( "h")) {Object Object = metastatementHandler.getValue ( "h"); metastatementhandler = metaobject.forobject (개체, default_object_factory, default_object_wrapper_factory); } // 分离最后一个代理对象的目标类 while (metastatementhandler.hasgetter ( "target")) {Object Object = metastatementHandler.getValue ( "target"); metastatementhandler = metaobject.forobject (개체, default_object_factory, default_object_wrapper_factory); } dialect = defaultDialect; pagesqlid = defaultPagesQlid; /* configuration configuration = (configuration) metastatementHandler.getValue ( "delegate.configuration"); dialect = configuration.getVariables (). getProperty ( "Dialect"); if (null == dialect || "".equals (dialect)) {logger.warn ( "속성 방언이 설정되지 않고 기본값 'mysql'"); 방언 = DefaultDialect; } pagesqlid = configuration.getVariables (). getProperty ( "pagesqlid"); if (null == pagesqlid || "".equals (pagesqlid)) {logger.warn ( "속성 pagesqlid가 설정되지 않고 기본값을 사용하지 않습니다.*page $ '"); pagesqlid = defaultPagesQlid; }*/ MappedStatement MAPPEDSTATEMENT = (MAPPEDSTATEMENT) METASTATEMENTHANDLER.GETVALUE ( "Delegate.MappedStatement"); // 只重写需要分页的 SQL 语句。通过 매핑 스테이트 的 id 匹配 匹配, 默认重写以 페이지 结尾的 페이지 结尾的 매핑 스테이트 的 sql if (mappedStatement.getId (). matches (pagesqlid)) {boundsql boundsql = (boundsql) metastatementhandler.getValue ( "delegate.boundsql"); Object ParameterObject = boundsql.getParameterObject (); if (parameterObject == NULL) {Throw New NullPointerException ( "ParameterObject는 NULL!"); } else {object obj = metastatementHandler .getValue ( "delegate.boundsql.parameterObject.page"); // 传入了 page 传入了 if (obj! = null && obj instanceof page && ((페이지) obj) .ispagination ()) {page page = (page) metastatementhandler .getValue ( "delegate.boundsql.parameterObject.page"); 문자열 sql = boundsql.getSql (); // sql 문자열 pagesql = buildPagesQl (sql, page); 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) invocation.getArgs () [0]; // setPageParameter (SQL, Connection, MappedStatement, BoundSQL, Page); }}} // 将执行权交给下一个拦截器 return invocation.proceed (); . MappedStatement, boundsql boundsql, page page) {// 记录总记录数 string countsql = "총 (" + sql + ")에서 count (0)을 셀러 (총”; 준비 상태 COUNTSTMT = NULL; resultSet rs = null; try {countstmt = connection.preparestatement (countsql); BONDSQL COUNTBS = NEW BONDSQL (MAPPEDSTATEMENT.GETCONFIGURATION (), COUNTSQL, BONDSQL.GETPARAMETERMAPPINGS (), BONDSQL.GETPARAMERTEROBJECT ()); 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 参数 (?) 设值 * * @param ps 参数 * @param mapappedstatement 参数 * @param boundsql 绑定 sql * @param parameterObject 参数对象 * @throws sqlexception 抛出 sql 异常 * / private void setparameters (준비된 스테이트, boundSql, mappedStatement mappedStatem ParameterObject)는 sqlexection {parameterHandler parameterHandler = 새로운 DefaultParameterAndler (MappedStatement, ParameterObject, BoundSQL); ParameterAndler.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 (delect)) {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 Page) {StringBuilder PagesQL = New StringBuilder (100); 문자열 beginrow = string.valueof ((page.getCurpage () -1) * page.getPagesize ()); pagesql.append (sql); pagesql.append ( "limit" + beginrow + "," + page.getPagesize ()); Return Pages Sql; } / ** * * hibernate 的实现完成 hibernate 的实现完成 oracle 的分页 * * @param sql 参数 * @param page 参数 * @return string * / public stringbuilder buildPagesQlFororacle (String SQL, Page Page) {StringBuilder PagesQL = New StringBuilder (100); 문자열 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 ( ") 임시 rownum <=") .append (endrow); pagesql.append ( ") where row_id>") Return Pages Sql; } / ** * @param target 参数 * @return object * / public object plugin (객체 대상) {// 当目标类是 stratehandler 类型时, 才包装目标类, 否者直接返回目标本身, 减少目标被代理的次数 if (target instanceof stationhandler) {return plugin.wrap (target, this); } else {반환 대상; }} / ** * @Param 속성 参数 * / public void setProperties (속성 속성) {}}以上就是本文的全部内容 以上就是本文的全部内容, 希望对大家的学习有所帮助, 也希望大家多多支持武林网。