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

首頁 > 數據庫 > MySQL > 正文

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

2024-07-24 13:14:53
字體:
來源:轉載
供稿:網友

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  }}

3、mybatis-config.xml里面注冊自己寫的攔截器

 <!-- 自定義的分頁攔截器 -->  <plugins>    <plugin interceptor="你寫的攔截器全類名">    </plugin>  </plugins>

Dao層相關的mapper.xml里面的sql語句不用做改動。

4、前端需要給后端一個顯示哪一頁的參數,通過service層組裝查詢參數之后交給MyBatis去查分頁數據,我定義的分頁DAO接口返回的數據是一個list,包含了分頁查詢結果。前端可以用jquery_pagination插件去實現分頁的展示,具體去官方github看怎么設置吧。

<!--pagination需要的腳本--><%  // 獲取請求的上下文  String context = request.getContextPath();%><link href="../css/pagination.css" rel="external nofollow" rel="stylesheet" type="text/css"/><script type="text/javascript" src="../js/jquery-1.11.3.js"></script><script type="text/javascript" src="../js/jquery.pagination.js"></script><script type="text/javascript">// 點擊分頁按鈕以后觸發的動作function handlePaginationClick(new_page_index, pagination_container) {<!--從stuForm表單提交當前頁的參數.可以使用restful方式,讓springmvc使用@PathVariable關鍵字定義的形參去接。這2個參數是分頁控件自己提供的,不需要我們去自己找,但是計數從0開始,而我們后臺分頁計數從1開始,因此要手動加1。 -->  $("#stuForm").attr("action", "你定義的分頁查詢url/"+(new_page_index+1));  $("#stuForm").submit();  return false;}$(function(){  $("#News-Pagination").pagination(${result.totalRecord}, {    items_per_page:${result.pageSize}, // 每頁顯示多少條記錄    current_page:${result.currentPage} - 1, // 當前顯示第幾頁數據    num_display_entries:8, // 分頁顯示的條目數    next_text:"下一頁",    prev_text:"上一頁",    num_edge_entries:2, // 連接分頁主體,顯示的條目數    callback:handlePaginationClick(當前頁,分頁div的id), //執行的回調函數    load_first_page:false //防止頁面一直刷新( 這條非常重要!)  });});</script><!-- 這部分用c:forEach標簽打印查詢結果的表格--><!--分頁控件名稱--><div id="News-Pagination"></div>

寫這篇總結的目的是希望形成一個分頁功能的整體解決方案(前端+后端都涵蓋到)。4月17、18日開始我會寫一個小系統將前段時間所學都用上,完了之后會回來更新這篇文章里面不正確的地方。

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
伦伦影院午夜日韩欧美限制| 国产精品中文字幕在线| 亚洲少妇激情视频| 国产精品成人免费视频| 日韩电影免费观看在线| 成人h猎奇视频网站| 亚洲视频欧洲视频| 伊人青青综合网站| 国产精品一区二区久久| 亚洲国产美女精品久久久久∴| 自拍偷拍亚洲精品| 国产欧美精品在线播放| 久久久久久久999精品视频| 欧美日韩国产中字| 成人精品久久av网站| 欧美极品少妇xxxxⅹ免费视频| 久久久久女教师免费一区| 亚洲最新av在线网站| 免费91麻豆精品国产自产在线观看| 亚洲国产日韩欧美在线动漫| 欧美日韩爱爱视频| 欧美午夜丰满在线18影院| 国产成人免费av| 久久久久久这里只有精品| 国产日韩精品在线观看| 国产精品高潮呻吟久久av黑人| 欧美中文字幕在线播放| 亚洲韩国青草视频| 国产区亚洲区欧美区| 欧美激情亚洲精品| 在线免费看av不卡| 欧美体内谢she精2性欧美| 日韩欧美福利视频| 国产成人免费91av在线| 亚洲精品一区中文字幕乱码| 91在线视频一区| 深夜福利一区二区| 伊人伊成久久人综合网站| 中文字幕亚洲一区| 国产视频丨精品|在线观看| 91九色国产视频| 国产高清在线不卡| 久操成人在线视频| 国产日韩精品在线| 亚洲免费人成在线视频观看| 中文字幕亚洲无线码在线一区| 精品国产31久久久久久| 亚洲美女喷白浆| 国语自产在线不卡| 91视频-88av| 91精品免费久久久久久久久| 亚洲成人1234| 一区二区日韩精品| 九九热99久久久国产盗摄| 国产精品亚洲激情| 狠狠爱在线视频一区| 日韩精品免费在线视频| 亚洲成人性视频| 欧美在线性爱视频| 日韩久久午夜影院| 欧美性jizz18性欧美| 中文字幕无线精品亚洲乱码一区| 欧美壮男野外gaytube| 91国内产香蕉| 欧美大尺度电影在线观看| 亚洲欧美视频在线| 欧美乱大交做爰xxxⅹ性3| 中文字幕av一区二区三区谷原希美| 精品爽片免费看久久| 日韩高清av在线| 亚洲精品美女在线观看播放| 欧洲日本亚洲国产区| 亚洲男人天堂手机在线| 超碰97人人做人人爱少妇| 欧美精品第一页在线播放| 色综合色综合网色综合| 亚洲第一福利在线观看| 国产日韩精品在线观看| 国产精品流白浆视频| 国产男女猛烈无遮挡91| 成人h猎奇视频网站| 最近2019年日本中文免费字幕| 欧美激情xxxx性bbbb| 国产精品揄拍500视频| 久久91超碰青草是什么| 亚洲男人天堂2023| 亚洲欧美日韩在线一区| 日本亚洲欧洲色α| 亚洲aa中文字幕| 亚洲一区二区三区在线视频| 韩国三级电影久久久久久| 日韩一区二区三区国产| 日本中文字幕成人| 91精品国产91久久久| 久久天堂av综合合色| 国产亚洲欧洲在线| 亚洲第一视频网站| 91精品国产91| 亚洲国产小视频在线观看| 在线观看91久久久久久| 亚洲电影免费观看高清完整版在线观看| 日韩在线高清视频| 国内精品久久久久影院 日本资源| 川上优av一区二区线观看| 91久久久久久| 一区二区三区回区在观看免费视频| www.欧美三级电影.com| 久久伊人色综合| 国产美女直播视频一区| 亚洲欧洲激情在线| 日韩hd视频在线观看| 亚洲欧美成人一区二区在线电影| 欧美大尺度电影在线观看| 亚洲一区精品电影| 欧美在线视频观看免费网站| 欧美激情精品久久久久久黑人| 久久99精品久久久久久噜噜| 97视频在线免费观看| 亚洲一区二区三区在线视频| 亚洲国产精品视频在线观看| 亚洲午夜精品久久久久久性色| 国产成人精品视频在线观看| 精品久久久一区二区| 日韩中文字幕在线观看| 国产不卡av在线免费观看| 欧美激情视频给我| 羞羞色国产精品| 久久久久久尹人网香蕉| 性色av一区二区三区在线观看| 日韩中文字幕免费| 日韩中文有码在线视频| 91精品视频在线看| 爱福利视频一区| 在线视频免费一区二区| 亚洲精品国产精品自产a区红杏吧| 亚洲跨种族黑人xxx| 最新国产精品亚洲| 日韩国产欧美精品在线| 国产999精品| 91成人精品网站| 欧美一区二区大胆人体摄影专业网站| 色综合伊人色综合网站| 国产精品永久在线| 久久香蕉频线观| 亚洲国产精品字幕| 欧美激情免费视频| 在线成人激情黄色| 国产成人精品视频在线| 国产精品国产三级国产专播精品人| 亚洲sss综合天堂久久| 精品亚洲夜色av98在线观看| 亚洲精品免费一区二区三区| 热re91久久精品国99热蜜臀| 精品人伦一区二区三区蜜桃网站| 国产精品成熟老女人| 91久久久国产精品| 国产+成+人+亚洲欧洲| 欧美日韩另类在线| 国产精品视频一| 国产人妖伪娘一区91| 久久久久中文字幕| 国产精品视频在线播放| 亚洲xxx视频| 国产亚洲精品美女|