国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網(wǎng)站 > 幫助中心 > 正文

MyBatis攔截器實(shí)現(xiàn)分頁功能的實(shí)現(xiàn)方法

2024-07-09 22:47:56
字體:
供稿:網(wǎng)友

MyBatis攔截器實(shí)現(xiàn)分頁功能的實(shí)現(xiàn)方法

前言:

首先說下實(shí)現(xiàn)原理。使用攔截器攔截原始的sql,然后加上分頁查詢的關(guān)鍵字和屬性,拼裝成新的sql語句再交給mybatis去執(zhí)行。

除了業(yè)務(wù)代碼之外,需要寫的東西不多,提幾個(gè)關(guān)鍵的:

1、分頁對象Page類。給該對象設(shè)置一個(gè)當(dāng)前頁數(shù)(前端給)、總記錄數(shù)(攔截器內(nèi)賦值)2個(gè)參數(shù),他就能幫你計(jì)算出分頁sql語句用的2個(gè)參數(shù)。

/** * 分頁對應(yīng)的實(shí)體類 */public class Page { /** * 總條數(shù) */ private int totalNumber; /** * 當(dāng)前第幾頁 */ private int currentPage; /** * 總頁數(shù) */ private int totalPage; /** * 每頁顯示條數(shù) */ private int pageNumber = 5; /** * 數(shù)據(jù)庫中l(wèi)imit的參數(shù),從第幾條開始取 */ private int dbIndex; /** * 數(shù)據(jù)庫中l(wèi)imit的參數(shù),一共取多少條 */ private int dbNumber; /** * 根據(jù)當(dāng)前對象中屬性值計(jì)算并設(shè)置相關(guān)屬性值 */ public void count() { // 計(jì)算總頁數(shù) int totalPageTemp = this.totalNumber / this.pageNumber; int plus = (this.totalNumber % this.pageNumber) == 0 ? 0 : 1; totalPageTemp = totalPageTemp + plus; if(totalPageTemp <= 0) { totalPageTemp = 1; } this.totalPage = totalPageTemp; // 設(shè)置當(dāng)前頁數(shù) // 總頁數(shù)小于當(dāng)前頁數(shù),應(yīng)將當(dāng)前頁數(shù)設(shè)置為總頁數(shù) if(this.totalPage < this.currentPage) { this.currentPage = this.totalPage; } // 當(dāng)前頁數(shù)小于1設(shè)置為1 if(this.currentPage < 1) { this.currentPage = 1; } // 設(shè)置limit的參數(shù) this.dbIndex = (this.currentPage - 1) * this.pageNumber; this.dbNumber = this.pageNumber; } public int getTotalNumber() { return totalNumber; } 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; this.count(); } public int getDbIndex() { return dbIndex; } public void setDbIndex(int dbIndex) { this.dbIndex = dbIndex; } public int getDbNumber() { return dbNumber; } public void setDbNumber(int dbNumber) { this.dbNumber = dbNumber; }}

2、關(guān)鍵的攔截器實(shí)現(xiàn)

package com.imooc.interceptor;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.Map;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 com.imooc.entity.Page;/** * 分頁攔截器 * * @author Skye * */@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class, Integer.class }) })public class PageInterceptor implements Interceptor { public Object intercept(Invocation invocation) throws Throwable { StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory()); MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement"); //通過MetaObject元數(shù)據(jù)取得方法名id:com.XXX.queryMessageListByPage String id = mappedStatement.getId(); //匹配在mybatis中定義的與分頁有關(guān)的查詢id if (id.matches(".+ByPage$")) { //BoundSql中有原始的sql語句和對應(yīng)的查詢參數(shù) BoundSql boundSql = statementHandler.getBoundSql(); Map<String, Object> params = (Map<String, Object>) boundSql.getParameterObject(); Page page = (Page) params.get("page"); String sql = boundSql.getSql(); String countSql = "select count(*)from (" + sql + ")a"; Connection connection = (Connection) invocation.getArgs()[0]; PreparedStatement countStatement = connection.prepareStatement(countSql); ParameterHandler parameterHandler = (ParameterHandler) metaObject.getValue("delegate.parameterHandler"); parameterHandler.setParameters(countStatement); ResultSet rs = countStatement.executeQuery(); if (rs.next()) { //為什么是getInt(1)? 因?yàn)閿?shù)據(jù)表的列是從1開始計(jì)數(shù) page.setTotalNumber(rs.getInt(1)); System.out.println("攔截器得知page的記錄總數(shù)為:" + page.getTotalNumber()); } String pageSql = sql + " limit " + page.getDbIndex() + "," + page.getDbNumber(); metaObject.setValue("delegate.boundSql.sql", pageSql); } return invocation.proceed(); } /** * @param target * 被攔截的對象 */ public Object plugin(Object target) { // 如果將攔截器類比喻為代購票的公司,那this就是代購業(yè)務(wù)員(進(jìn)入方法前是無代理購票能力業(yè)務(wù)員,進(jìn)入后成為有代理能力的業(yè)務(wù)員) // 通過注解獲取攔截目標(biāo)的信息,如果不符合攔截要求就返回原目標(biāo),如果符合則使用動(dòng)態(tài)代理生成代理對象 return Plugin.wrap(target, this); } public void setProperties(Properties properties) { // TODO Auto-generated method stub }}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 江永县| 清徐县| 东平县| 泗阳县| 河津市| 杨浦区| 绥棱县| 深泽县| 新宁县| 云南省| 漾濞| 天祝| 隆昌县| 改则县| 洪湖市| 崇左市| 海盐县| 壶关县| 沙湾县| 东阿县| 库伦旗| 浠水县| 霍林郭勒市| 嘉兴市| 麻城市| 衡东县| 临颍县| 怀仁县| 南投市| 双城市| 太仓市| 杨浦区| 建湖县| 尼木县| 屯门区| 鹤峰县| 白河县| 大新县| 沧源| 北京市| 晋州市|