婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 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攔截器實現分頁功能的實現方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久久国产精品麻豆| 亚洲天堂精品在线观看| 欧美三级视频在线观看| 日韩精品一区在线观看| 亚洲成人一区在线| 91成人国产精品| 亚洲激情网站免费观看| 成人丝袜18视频在线观看| 欧美日韩综合一区| 综合激情成人伊人| gogo大胆日本视频一区| 中文字幕佐山爱一区二区免费| 国产主播一区二区三区| 久久这里都是精品| 国产高清久久久久| 中文字幕一区在线观看视频| 色综合天天综合在线视频| 久久精品欧美日韩精品| 国产福利电影一区二区三区| 国产精品久久久久久久久久久免费看 | 美女爽到高潮91| 国产精品美女久久久久av爽李琼 | 555www色欧美视频| 国产成人精品免费在线| 一区二区三区电影在线播| 在线成人小视频| 国产黄人亚洲片| 偷拍一区二区三区| 国产精品国产三级国产专播品爱网| 91电影在线观看| 成人精品国产一区二区4080| 亚洲二区视频在线| 亚洲综合一二区| 国产日韩亚洲欧美综合| 亚洲精品一区二区三区香蕉| 欧美日韩dvd在线观看| aa级大片欧美| 国产一区91精品张津瑜| 国产精品一区二区久久精品爱涩| 日本va欧美va精品发布| 亚洲福中文字幕伊人影院| 亚洲免费观看视频| 亚洲另类春色校园小说| 综合亚洲深深色噜噜狠狠网站| 久久免费精品国产久精品久久久久 | 视频一区国产视频| 日本亚洲一区二区| 免费的成人av| 成人免费毛片高清视频| 91年精品国产| 欧美一区二区国产| 久久久精品天堂| 亚洲裸体在线观看| 视频一区二区不卡| 久久99国产精品免费网站| 成人免费av在线| 在线精品视频小说1| 日本韩国一区二区三区视频| 欧美乱妇15p| 久久久久久久久伊人| 亚洲视频一区在线观看| 奇米精品一区二区三区在线观看| 麻豆国产精品官网| 欧美猛男男办公室激情| 2023国产一二三区日本精品2022| 中文字幕字幕中文在线中不卡视频| 亚洲综合av网| 成人黄色av电影| 久久女同互慰一区二区三区| 午夜视频在线观看一区二区| 国产成人精品综合在线观看| 欧美sm美女调教| 蜜臀91精品一区二区三区| 97se亚洲国产综合自在线观| 中文字幕欧美日韩一区| 蓝色福利精品导航| 91精品国产91综合久久蜜臀| 日韩极品在线观看| 日韩一区二区三区四区五区六区| 亚洲乱码国产乱码精品精小说 | 精品少妇一区二区三区日产乱码| 亚洲成人一区在线| 91精品国产一区二区| 午夜av一区二区| 国产精品亚洲第一区在线暖暖韩国| 精品欧美一区二区久久| 国产精品亚洲а∨天堂免在线| 中文av一区特黄| av亚洲精华国产精华精| 一区二区三区四区乱视频| 欧美美女一区二区三区| 麻豆传媒一区二区三区| 国产精品国产精品国产专区不蜜| 99久久精品免费精品国产| 午夜精品久久久久久久| 欧美一区二区播放| 91香蕉视频黄| 开心九九激情九九欧美日韩精美视频电影 | 夜夜爽夜夜爽精品视频| 精品日产卡一卡二卡麻豆| 99久久久无码国产精品| 精品一区二区三区香蕉蜜桃| 亚洲精品一二三| 亚洲免费视频中文字幕| 91精品国产91久久综合桃花| 成人91在线观看| 国产精品资源在线| 日本不卡高清视频| 亚洲精品视频在线| 日韩毛片视频在线看| 精品国产91洋老外米糕| 欧美剧在线免费观看网站| 在线亚洲一区观看| 色哟哟国产精品| 色综合久久88色综合天天6| 国产99久久久久久免费看农村| 韩国午夜理伦三级不卡影院| 亚洲国产成人精品视频| 日产欧产美韩系列久久99| 亚洲美女视频在线观看| 亚洲综合一二区| 亚洲综合激情网| 日本成人在线看| 国产乱码精品一区二区三区av| 精品在线亚洲视频| 国产白丝精品91爽爽久久| 99精品视频中文字幕| 91精品国产91综合久久蜜臀| 精品播放一区二区| 国产精品盗摄一区二区三区| 亚洲成人av福利| 成人午夜精品在线| 一本大道久久a久久综合| 欧美人狂配大交3d怪物一区| 精品人伦一区二区色婷婷| 国产精品久久久久久福利一牛影视 | 精品国产乱子伦一区| 亚洲欧洲精品一区二区三区| 亚洲人成影院在线观看| 九九久久精品视频 | 国产精品综合一区二区三区| 一本在线高清不卡dvd| 日韩美女视频在线| 一区二区高清在线| 色综合天天狠狠| 国产精品美女久久久久久久久久久| 国产亚洲美州欧州综合国 | 日韩视频免费观看高清完整版 | 欧美视频中文一区二区三区在线观看 | 国产精品美日韩| 麻豆视频一区二区| 欧美午夜电影网| 亚洲高清视频的网址| 99精品欧美一区二区三区综合在线| 精品国产乱码久久久久久免费| 亚洲成人www| 欧美蜜桃一区二区三区| 日本免费在线视频不卡一不卡二 | 国产成+人+日韩+欧美+亚洲| 亚洲成人av中文| 色www精品视频在线观看| 亚洲免费在线看| 欧美日韩在线观看一区二区 | 亚洲超碰97人人做人人爱| 色播五月激情综合网| 日本v片在线高清不卡在线观看| 欧美日韩国产高清一区二区| 精品一区二区三区久久久| 久久这里只精品最新地址| 99国产精品久久久久久久久久久| 亚洲综合999| 久久综合九色欧美综合狠狠| 亚洲男人天堂一区| 欧美精品久久久久久久多人混战| 粉嫩一区二区三区性色av| 中文字幕va一区二区三区| 一本到三区不卡视频| 日韩福利电影在线| 国产免费成人在线视频| 欧美精品一二三区| 成人中文字幕电影| 久久不见久久见免费视频1| 1024成人网色www| 精品国精品国产| 色先锋久久av资源部| a级精品国产片在线观看| 另类小说视频一区二区| 亚洲精品国产精品乱码不99 | 欧美疯狂性受xxxxx喷水图片| 成人免费视频一区| 成人的网站免费观看| 91欧美激情一区二区三区成人| 高清日韩电视剧大全免费| 国产精品自拍毛片| 国产aⅴ综合色| 色噜噜久久综合| 91精品国产欧美一区二区| 日韩一区二区在线观看视频播放| 欧美一区二区三区思思人| 久久久美女毛片|