亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品亚洲аv天堂网| 国产亚洲精品久久久久久牛牛| 欲色天天网综合久久| 国产亚洲精品久久久| 丰满岳妇乱一区二区三区| 国产suv精品一区二区三区88区| 色综合伊人色综合网站| 91视频免费网站| 亚洲xxxx在线| 国产精品www网站| 久久精彩免费视频| 久久国产精品久久久久久| 日韩极品精品视频免费观看| 日韩精品免费综合视频在线播放| 欧美电影免费观看电视剧大全| 成人免费淫片aa视频免费| 欧美激情一区二区久久久| 欧美另类69精品久久久久9999| 国产偷国产偷亚洲清高网站| 成人福利网站在线观看| 福利一区福利二区微拍刺激| 国产aaa精品| 国产精品久久久久久久久免费| 亚洲成人久久电影| 欧美高清视频免费观看| 亚洲欧洲在线免费| 国产亚洲欧洲高清| 福利精品视频在线| 日韩在线视频播放| 精品久久久香蕉免费精品视频| 亚洲女同精品视频| 国产精品一区二区三区久久| 日韩精品在线私人| 人体精品一二三区| 国产成人精品日本亚洲| 欧美性在线观看| 亚洲人成电影网站色…| 久热99视频在线观看| 亚洲v日韩v综合v精品v| 亚洲一区二区中文字幕| 国产精品视频网站| 欧美午夜性色大片在线观看| 97久久久免费福利网址| 亚洲欧洲偷拍精品| 久久久精品国产| 91九色单男在线观看| 欧美精品福利在线| 国产一区二区丝袜高跟鞋图片| 日韩av在线免费播放| 亚洲精品久久7777777| 久久精品视频va| 国产亚洲xxx| 国产a∨精品一区二区三区不卡| 欧美精品激情在线| 成人午夜黄色影院| 亚洲天堂男人天堂女人天堂| 日韩**中文字幕毛片| 精品久久久久久国产91| 亚洲毛片在线观看| 丝袜美腿精品国产二区| 国产热re99久久6国产精品| 欧美激情精品久久久久久| 欧美极品美女电影一区| 国产免费亚洲高清| 亚洲自拍偷拍第一页| 亚洲国产成人精品女人久久久| 欧美主播福利视频| 日韩欧美国产黄色| 亚洲香蕉在线观看| 国产91精品青草社区| 欧美成人久久久| 久久精视频免费在线久久完整在线看| 九九热精品视频| 久久久av亚洲男天堂| 国产美女精品免费电影| 亚洲激情电影中文字幕| 久久久精品国产一区二区| 日韩美女av在线| 日韩在线观看av| 欧美日韩国产限制| 97久久精品人搡人人玩| 亚洲九九九在线观看| 97精品国产97久久久久久免费| 欧美做爰性生交视频| 亚洲一区二区自拍| 亚洲第一男人天堂| 国产成人涩涩涩视频在线观看| 亚洲精品99久久久久中文字幕| 久久精品国产免费观看| 久久久久久高潮国产精品视| 久久久av一区| 久久精品最新地址| 亚洲视频国产视频| 亚洲区免费影片| 亚洲日本成人女熟在线观看| 国产欧美日韩精品在线观看| 亚洲午夜性刺激影院| 午夜精品久久久久久久白皮肤| 国产ts人妖一区二区三区| 日韩一二三在线视频播| 91精品视频在线看| 在线成人激情黄色| 成人黄色av免费在线观看| 久久人人97超碰精品888| 福利微拍一区二区| 日韩在线观看网站| 亚洲午夜精品久久久久久久久久久久| 久久91亚洲精品中文字幕奶水| 国产日韩换脸av一区在线观看| 亚洲欧美综合图区| 欧美精品18videosex性欧美| 久久精品久久久久久国产 免费| 亚洲综合精品伊人久久| 欧美激情中文字幕在线| 欧美亚洲在线播放| 亚洲国产小视频在线观看| 久久精品福利视频| 日韩精品在线观看一区二区| 亚洲成人1234| 国产精品久久久久久久一区探花| 日韩精品日韩在线观看| 久久97精品久久久久久久不卡| 国产一区二区三区高清在线观看| 26uuu久久噜噜噜噜| 欧美大全免费观看电视剧大泉洋| 亚洲男人天堂2019| 亚洲嫩模很污视频| 国产精品高潮呻吟久久av野狼| 最新国产精品拍自在线播放| 97人人做人人爱| 欧美自拍视频在线观看| 亚洲aa中文字幕| 精品人伦一区二区三区蜜桃免费| 日本91av在线播放| 日韩美女在线观看一区| 欧美性生交大片免网| 在线电影av不卡网址| 亚洲午夜精品久久久久久久久久久久| 91免费精品国偷自产在线| 久久亚洲国产精品| 欧美一区三区三区高中清蜜桃| 伊人精品在线观看| 社区色欧美激情 | 欧美整片在线观看| 国产精品美乳在线观看| 国产精品久久久久久久久粉嫩av| 午夜免费在线观看精品视频| 日韩精品在线电影| 国产精品久久久久免费a∨大胸| 亚洲精品720p| 黑人与娇小精品av专区| 久久久精品久久久久| 欧美做爰性生交视频| 亚洲无av在线中文字幕| 国产免费亚洲高清| 欧美在线欧美在线| 欧美精品videosex性欧美| 欧美做受高潮电影o| 亚洲资源在线看| 欧美大片在线看| 国产精品福利久久久| 久久久久久18| 97人洗澡人人免费公开视频碰碰碰| 亚洲性av在线|