java:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Properties; import org.apache.ibatis.executor.parameter.ParameterHandler; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import 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.DefaultReflectorFactory; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.SystemMetaObject; import org.imooc.bean.BaseBean; import org.imooc.bean.Page; @Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})}) public class PageInterceptor implements Interceptor{ public Object intercept(Invocation arg0) throws Throwable { StatementHandler statementHandler = (StatementHandler)arg0.getTarget(); MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,new DefaultReflectorFactory()); MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement"); String id = mappedStatement.getId(); if(id.endsWith("ByPage")) { BoundSql boundSql = statementHandler.getBoundSql(); String sql = boundSql.getSql(); String countSql = "select count(*) from(" + sql + ")t"; Connection conn = (Connection)arg0.getArgs()[0]; PreparedStatement statement = conn.prepareStatement(countSql); ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler"); parameterHandler.setParameters(statement); ResultSet rs = statement.executeQuery(); BaseBean bean = (BaseBean)boundSql.getParameterObject(); Page page = bean.getPage(); if(rs.next()) { page.setTotalNumber(rs.getInt(1)); } String pageSql = sql + " limit " + (page.getCurrentPage() - 1) * page.getPageNumber() + "," + page.getPageNumber(); metaObject.setValue("delegate.boundSql.sql", pageSql); } return arg0.proceed(); } public Object plugin(Object arg0) { return Plugin.wrap(arg0, this); } public void setProperties(Properties arg0) { } }
/** * 分页对象 */ public class Page { // 总条数 private int totalNumber; // 当前页数 private int currentPage; // 总页数 private int totalPage; // 每页显示条数 private int pageNumber; public Page() { this.currentPage = 1; this.pageNumber = 5; } public int getTotalNumber() { return totalNumber; } private void count() { this.totalPage = this.totalNumber / this.pageNumber; if(this.totalNumber % this.pageNumber > 0) { this.totalPage++; } if(this.totalPage <= 0) { this.totalPage = 1; } if(this.currentPage > this.totalPage) { this.currentPage = this.totalPage; } if(this.currentPage <= 0) { this.currentPage = 1; } } public void setTotalNumber(int totalNumber) { this.totalNumber = totalNumber; this.count(); } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getPageNumber() { return pageNumber; } public void setPageNumber(int pageNumber) { this.pageNumber = pageNumber; } }
public class BaseBean { private Page page; public BaseBean() { this.page = new Page(); } public Page getPage() { return page; } public void setPage(Page page) { this.page = page; } }
jsp页面:
<%@ tag language="java" pageEncoding="UTF-8" %> <%@ attribute type="org.imooc.bean.Page" name="page" required="true" %> <%@ attribute type="String" name="jsMethodName" required="true" %> <script type="text/javascript"> function transCurrentPage(currentPage) { var rule = /^[0-9]*[1-9][0-9]*$/; if(!rule.test(currentPage)) { currentPage = 1; } eval("${jsMethodName}(currentPage)"); } </script> <div class="page fix"> <a href="javascript:transCurrentPage('1');" class="first">首页</a> <a href="javascript:transCurrentPage('${page.currentPage - 1}');" class="pre">上一页</a> 当前第<span>${page.currentPage}/${page.totalPage}</span>页 <a href="javascript:transCurrentPage('${page.currentPage + 1}');" class="next">下一页</a> <a href="javascript:transCurrentPage('${page.totalPage}');" class="last">末页</a> 跳至 <input id="currentPageText" value="1" class="allInput w28" type="text"/> 页 <a href="javascript:transCurrentPage($('#currentPageText').val());" class="go">GO</a> </div>
调用:
<%@ taglib prefix="t" tagdir="/WEB-INF/tags"%> <!-- 分页 --> <t:page jsMethodName="search" page="${searchParam.page}"></t:page>