亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > MyBatis攔截器實現分頁功能的實現方法

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

熱門標簽:電話機器人免費嗎 電銷機器人價格多少錢一臺 地圖標注圖標素材入駐 400電話申請什么好 好搜地圖標注 龍圖酒吧地圖標注 百度地圖標注地方備注 怎么辦理400電話呢 怎么申請400電話申請

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();
      MapString, Object> params = (MapString, 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日開始我會寫一個小系統將前段時間所學都用上,完了之后會回來更新這篇文章里面不正確的地方。

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

您可能感興趣的文章:
  • mybatisplus 的SQL攔截器實現關聯查詢功能
  • Mybatis自定義攔截器和插件開發詳解
  • mybatis 自定義實現攔截器插件Interceptor示例
  • mybatis 通過攔截器打印完整的sql語句以及執行結果操作
  • Mybatis Plugin攔截器開發過程詳解
  • 簡單了解mybatis攔截器實現原理及實例
  • mybatis攔截器實現通用權限字段添加的方法
  • Mybatis中攔截器的簡單實現方法
  • mybatis攔截器與分頁插件實例教程
  • Mybatis Interceptor 攔截器的實現
  • MyBatis攔截器的原理與使用

標簽:廣西 汕尾 浙江 撫順 固原 溫州 內江 防疫工作

巨人網絡通訊聲明:本文標題《MyBatis攔截器實現分頁功能的實現方法》,本文關鍵詞  MyBatis,攔截,器,實現,分頁,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MyBatis攔截器實現分頁功能的實現方法》相關的同類信息!
  • 本頁收集關于MyBatis攔截器實現分頁功能的實現方法的相關信息資訊供網民參考!
  • 推薦文章
    欧美另类videosbestsex| 国产a网| 亚洲爆爽| 国产一区二区精品久久| 日本特黄特色aaa大片免费| 久久成人亚洲| 精品久久久久久中文字幕一区| 国产精品12| 日韩一级黄色| 精品视频在线观看一区二区三区| 沈樵在线观看福利| 久久国产精品永久免费网站| 青草国产在线观看| 久久久成人网| 国产高清在线精品一区二区 | 国产精品免费久久| 国产a免费观看| 久久99这里只有精品国产| 精品国产一区二区三区免费| 你懂的福利视频| 国产综合91天堂亚洲国产| 日韩欧美一二三区| 91麻豆精品国产自产在线| 久草免费在线视频| 99久久精品国产高清一区二区 | 99久久精品国产国产毛片| 韩国三级视频在线观看| 免费国产在线视频| 精品视频在线观看视频免费视频| 999久久狠狠免费精品| 亚洲女人国产香蕉久久精品| 日韩专区第一页| 国产伦理精品| 色综合久久久久综合体桃花网| 欧美另类videosbestsex视频| 久久99青青久久99久久| 国产一区免费观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 可以免费在线看黄的网站| 国产成人精品一区二区视频| a级精品九九九大片免费看| 四虎影视精品永久免费网站| 99热精品一区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日韩字幕在线| 精品在线免费播放| 午夜在线亚洲男人午在线| 久久久成人网| 韩国三级视频在线观看| 久久精品大片| 亚洲女人国产香蕉久久精品| 亚洲爆爽| 成人高清视频免费观看| 国产综合91天堂亚洲国产| 国产91精品一区| 久久久成人网| 九九精品影院| 国产综合成人观看在线| 久草免费在线色站| 精品在线观看一区| 国产成人欧美一区二区三区的| 欧美日本国产| 精品国产一区二区三区久久久狼 | 国产福利免费观看| 欧美另类videosbestsex视频| 成人在激情在线视频| 午夜在线亚洲| 九九国产| 欧美国产日韩一区二区三区| 精品国产一区二区三区久久久狼| 国产成人女人在线视频观看| a级黄色毛片免费播放视频| 免费的黄视频| 国产一区二区精品久| 国产不卡在线看| 青草国产在线| 青青青草影院| 九九干| 国产综合91天堂亚洲国产| 亚洲 国产精品 日韩| 黄视频网站在线观看| 夜夜操网| 国产麻豆精品高清在线播放| 欧美国产日韩一区二区三区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩在线观看视频网站| 日本伦理黄色大片在线观看网站| 日韩女人做爰大片| 天天色色色| 国产一区二区精品久| 欧美激情一区二区三区视频高清| 精品国产一区二区三区久久久狼 | 精品视频免费在线| 国产福利免费视频| 国产综合91天堂亚洲国产| 亚洲天堂在线播放| 成人a大片在线观看| 天天色色色| 精品久久久久久综合网| a级精品九九九大片免费看| 日本在线不卡免费视频一区| 精品久久久久久免费影院| 国产91精品一区| 天天做人人爱夜夜爽2020毛片| 午夜在线亚洲男人午在线| 精品久久久久久综合网| 91麻豆精品国产高清在线| 天天做日日爱夜夜爽| 台湾毛片| 国产a网| 沈樵在线观看福利| 99久久精品费精品国产一区二区| 国产成人精品综合在线| 日本在线www| 免费一级片网站| 国产亚洲免费观看| 精品视频免费看| 国产视频一区二区在线播放| 国产一区二区精品久久91| 国产不卡高清在线观看视频| 在线观看成人网 | 免费一级生活片| 成人免费观看的视频黄页| 国产原创视频在线| 99久久精品费精品国产一区二区| 欧美大片毛片aaa免费看| 四虎影视久久久免费| 久久国产一久久高清| 国产不卡在线看| 欧美一级视频免费观看| 99色视频在线观看| 九九久久99综合一区二区| 日本特黄特黄aaaaa大片| 99久久精品国产国产毛片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 可以免费在线看黄的网站| 亚洲精品影院一区二区| 香蕉视频久久| 欧美另类videosbestsex久久| 青青青草视频在线观看| 成人a大片在线观看| 国产a网| 一级女性全黄久久生活片| 成人a级高清视频在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产精品1024永久免费视频 | 97视频免费在线| 九九久久国产精品| 欧美爱爱动态| 精品美女| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日韩女人做爰大片| 你懂的福利视频| 精品视频在线观看一区二区 | 九九精品久久久久久久久| 日韩中文字幕一区| 久久久久久久男人的天堂| 亚洲不卡一区二区三区在线 | 国产极品精频在线观看| 国产伦精品一区二区三区在线观看| 国产国语在线播放视频| 国产精品自拍一区| 国产成人啪精品| 亚飞与亚基在线观看| 美女被草网站| 亚洲爆爽| 精品国产亚洲人成在线| 一级女人毛片人一女人| 欧美激情一区二区三区中文字幕| 国产极品精频在线观看| 香蕉视频久久| 精品国产亚一区二区三区| 成人免费观看网欧美片| 精品美女| 欧美a级成人淫片免费看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚洲女人国产香蕉久久精品| 一级女性全黄久久生活片| 日本免费区| 四虎久久精品国产| 四虎影视久久久免费| 日韩字幕在线| 日本伦理黄色大片在线观看网站| 久久国产精品自由自在| 香蕉视频亚洲一级| 九九久久99综合一区二区| 久久精品大片| 中文字幕一区二区三区 精品| 免费的黄视频| 国产极品白嫩美女在线观看看| 91麻豆爱豆果冻天美星空| 日韩在线观看视频网站| a级精品九九九大片免费看| 国产精品自拍一区| 成人免费一级纶理片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产不卡精品一区二区三区| 日韩免费片| 欧美一区二区三区在线观看| 国产精品12|