麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 網站 > 幫助中心 > 正文

MyBatis攔截器實現分頁功能的實現方法

2024-07-09 22:47:56
字體:
來源:轉載
供稿:網友

MyBatis攔截器實現分頁功能的實現方法

前言:

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

除了業務代碼之外,需要寫的東西不多,提幾個關鍵的:

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

/** * 分頁對應的實體類 */public class Page { /** * 總條數 */ private int totalNumber; /** * 當前第幾頁 */ private int currentPage; /** * 總頁數 */ private int totalPage; /** * 每頁顯示條數 */ private int pageNumber = 5; /** * 數據庫中limit的參數,從第幾條開始取 */ private int dbIndex; /** * 數據庫中limit的參數,一共取多少條 */ private int dbNumber; /** * 根據當前對象中屬性值計算并設置相關屬性值 */ public void count() { // 計算總頁數 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; // 設置當前頁數 // 總頁數小于當前頁數,應將當前頁數設置為總頁數 if(this.totalPage < this.currentPage) { this.currentPage = this.totalPage; } // 當前頁數小于1設置為1 if(this.currentPage < 1) { this.currentPage = 1; } // 設置limit的參數 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、關鍵的攔截器實現

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元數據取得方法名id:com.XXX.queryMessageListByPage String id = mappedStatement.getId(); //匹配在mybatis中定義的與分頁有關的查詢id if (id.matches(".+ByPage$")) { //BoundSql中有原始的sql語句和對應的查詢參數 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)? 因為數據表的列是從1開始計數 page.setTotalNumber(rs.getInt(1)); System.out.println("攔截器得知page的記錄總數為:" + 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就是代購業務員(進入方法前是無代理購票能力業務員,進入后成為有代理能力的業務員) // 通過注解獲取攔截目標的信息,如果不符合攔截要求就返回原目標,如果符合則使用動態代理生成代理對象 return Plugin.wrap(target, this); } public void setProperties(Properties properties) { // TODO Auto-generated method stub }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久综合av | 91国内精品久久久久免费影院 | 一及毛片视频 | 失禁高潮抽搐喷水h | 日韩黄色在线播放 | 久久久久久亚洲综合影院红桃 | 国产妇女乱码一区二区三区 | 成人福利网 | 久草在线视频福利 | 欧美成人a | 麻豆视频观看 | 国产免费网站视频 | 亚洲人成中文字幕在线观看 | 久久男人的天堂 | 日韩在线欧美在线 | 国产精品久久久乱弄 | 精品日韩欧美 | 最新一区二区三区 | 特黄一级小说 | 成人在线观看免费 | 天天干天天透 | 精品久久久久久久久久久久久 | 在线播放视频一区二区 | 午夜爽爽爽男女免费观看hd | 日日做夜夜操 | 曰韩毛片 | 今井夏帆av一区二区 | 黑人一区二区三区四区五区 | 一级黄色在线观看 | 久久精品二区 | 日韩视频在线观看免费视频 | 看毛片电影 | 亚州视频在线 | 本色视频aaaaaa一级网站 | 国产精品中文在线 | 国产亚洲精品久久午夜玫瑰园 | 羞羞视频一区 | 免费国产一区二区视频 | 深夜激情视频 | 成人免费av在线播放 | japan护士性xxxⅹhd |