本文實例為大家分享了完整的java分頁攔截類,供大家參考,具體內容如下
包com.opms.interceptor; import java.sql.connection; import java.sql.preparedstatement; import java.sql.sql.Resultset; import java.sql.sqlexception; import java java java.util.util.properties; import org.apache.ibate.apache.ibatis.ececuter.corter.corter.corter.parameter.parameter.parameter.parameter.parameter.parameter.parameter; org.apache.ibatis.executor.statement.statement.statementhandler; import org.apache.ibatis.logging.log; import org.apache.ibatis.logging.logfactory; import org.apache.ibate.ibatis.ibatis.ibatis.mapping.mapping.bopping.boundsql; 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.apache.ibatis.reflection.MetaObject;import 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.ObjectWrapperFactory;import org.apache.ibatis.scripting.defaults.DefaultParameterHandler;import org.apache.ibatis.session.RowBounds;import com.wifi.core.page.Page;/** * 通過攔截<code>StatementHandler</code>的<code>prepare</code>方法,重寫sql語句實現物理分頁。 * 老規矩,簽名里要攔截的類型只能是接口。 * * @author 湖畔微風 * */@intercepts({@signature(type = statementhandler.class,method =“ prepard”,args = {connection.class})})public class class pageInterpectors interceptor {/** *日誌/** */private static final log logger = logfactory.getLog.getLog(pageinterpector.class.class); / ** *聲明對象 */ private static final objectFactory default_object_factory = new DefaultObjectFactory(); / ** *聲明對象 */ private static final objectWrapperFactory default_object_wrapper_factory = new DefaultObjectWrapperFactory(); / ** *數據庫類型(默認為mysql) */私有靜態字符串defaultDialect =“ mysql”; / ***需要攔截的id(正則匹配)*/私有靜態字符串defaultPagesqlid =“。*4page $”; / ** *數據庫類型(默認為mysql) */私有靜態字符串方言=“”; / ** *需要攔截的id(正則匹配) */私有靜態字符串pagesqlid =“”; / ** * @param Invocation參數 * @return對象 * @throws throwable throwable */ public object intercept(invocation invocation)拋出throwable {statementhandler statementhandler =(statementhandler)invocation.getTarget(); metaObject metAstatementHandler = metaObject.forObject(statementHandler,default_object_factory,default_object_wrapper_factory); //分離代理對象鏈(由於目標類可能被多個攔截器攔截,從而形成多次代理,通過下面的兩次循環可以分離出最原始的的目標類)while(metastatementhandler.hasgetter(“ h”)){object object = metastatatementhandler.getValue(“ h”); metAstatementHandler = metaObject.forObject(object,default_object_factory,default_object_wrapper_factory); } // while(metastatementhandler.hasgetter(“ target”)){object object = metastatementhandler.getValue(“ target”); metAstatementHandler = metaObject.forObject(object,default_object_factory,default_object_wrapper_factory); }方言= defaultDialect; pagesqlid = defaultPagesqlid; /*配置配置=(配置)metastatementHandler.getValue(“ delegate.configuration”);方言= configuration.getVariobles()。 getProperty(“ arilect”); if(null ==方言||“” .equals(arilect)){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.mapperstatement”); // 只重寫需要分頁的sql語句。通過MappedStatement的ID匹配,默認重寫以Page結尾的MappedStatement的sql if (mappedStatement.getId().matches(pageSqlId)) { BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql"); object parameterObject = bundsql.getParameterObject(); if(parameterObject == null){投擲新的NullPoInterException(“ parameterObject為null!”); } else {object obj = metastatementHandler .getValue(“ delegate.boundsql.parameterobject.page”); //傳入了頁參數且需要開啟分頁時if(obj!= null && obj instanceof page &&((page)obj).ispagination()){page page =(page)metastatatementHandler .getValue(“ delegate.boundsql.parameterobject.parameterobject.page.page.page”);字符串sql = bundsql.getsql(); //重寫sql String Pagesql = buildPagesql(SQL,page); metastatementHandler.setValue(“ delegate.boundsql.sql”,pagesql); //採用物理分頁後,就不需要,mybatis的內存分頁了,所以重置下面的兩個參數metastatementhandler.setValue(“ delegate.rowbounds.offsets.offset”,rowbounds.no_row_offset); metastatementHandler.setValue(“ delegate.Rowbounds.limit”,rowbounds.no_row_limit);連接連接=(連接)Invocation.getArgs()[0]; //重設分頁參數里的總頁數等SETPAGEPARAMETER(SQL,連接,MappedStatement,BoundSQL,page); }}} // return return Invocation.proceed(); }/** *從數據庫裡查詢總的記錄數併計算總頁數從數據庫裡查詢總的記錄數併計算總頁數映射statement,bundsql bundsql,頁面){//記錄總記錄數字符串countsql =“ select count(0)摘要(“ + sql +”)as total';準備成立的countstmt = null; Resultset Rs = null;嘗試{countstmt = connection.preparestatement(countsql); boundsql countbs = new bundsql(mappedstatement.getConfiguration(),countsql,bundsql.getParamEtermAppings(),boundsql.getParameterObject()); setParameters(countstmt,mappedstatement,countbs,boundsql.getParameterObject()); rs = countstmt.executequery(); int totalCount = 0;如果(rs.Next()){totalCount = rs.GetInt(1); } page.setTotalCount(totalCount); page.init(pag.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); }}}} / ** *對s sql參數(? )設值 * @param ps參數 * @param mappedStatement參數 * @param bundsql sql * @param parameterObject參數對象parameterObject)拋出sqlexception {parameterhandler parameterhandler = new defaultParameterHandler(mappedStatement,parameterObject,bungsql); parameterhandler.setParameters(ps); } / ** *根據數據庫類型,SQL * * @param SQL餐宿 * @param Page頁 * @return String * / private String build buildpagesql(String sql,sql,page){if(page!= null){strignbuilder pagesql pagesql pagesql = new StringBuilder(); if(“ mysql” .equals(arilect)){pagesql = buildpagesqlformysql(sql,page); } else if(“ oracle” .equals(arilect)){pagesql = buildpagesqlfororacle(sql,page); } else {return sql; } return pagesql.tostring(); } else {return sql; }} / ** * mysql的分頁語句 * * @param sql參數 * @param頁面頁 * @return string * / public StringBuilder builder build build buildpagesqlformysql(字符串SQL,頁面){stringBuilder pages pagesql = new StringBuilder(100);字符串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 buildbuilder buildpagesqlfororacle(字符串SQL,頁面){stringBuilder page)字符串beginrow = string.valueof(((page.getCurpage() - 1) * page.getPageSize());字符串endrow = string.valueof(page.getCurpage() * page.getPagesize()); PAGESQL.APPEND(“選擇 * from(select temp。返回pagesql; } / ** * @param target參數 * @return對象 * / public Object插件(對象目標){//當目標類是語句handler類型時,才包裝目標類,否者直接返回目標本身,減少目標被代理的次數if(target instanceof statementHandler){return plugin.wrap(target,target,target,this); } else {返回目標; }} / ** * @param屬性參數 * / public void setProperties(properties properties){}}}以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。 ,也希望大家多多支持武林網。