本文实例为大家分享了完整的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){}}}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。,也希望大家多多支持武林网。