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

主頁 > 知識庫 > MyBatis攔截器實現(xiàn)分頁功能的實現(xiàn)方法

MyBatis攔截器實現(xiàn)分頁功能的實現(xiàn)方法

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

MyBatis攔截器實現(xiàn)分頁功能的實現(xiàn)方法

前言:

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

除了業(yè)務(wù)代碼之外,需要寫的東西不多,提幾個關(guān)鍵的:

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

/**
 * 分頁對應(yīng)的實體類
 */
public class Page {
  /**
   * 總條數(shù)
   */
  private int totalNumber;
  /**
   * 當前第幾頁
   */
  private int currentPage;
  /**
   * 總頁數(shù)
   */
  private int totalPage;
  /**
   * 每頁顯示條數(shù)
   */
  private int pageNumber = 5;
  /**
   * 數(shù)據(jù)庫中l(wèi)imit的參數(shù),從第幾條開始取
   */
  private int dbIndex;
  /**
   * 數(shù)據(jù)庫中l(wèi)imit的參數(shù),一共取多少條
   */
  private int dbNumber;

  /**
   * 根據(jù)當前對象中屬性值計算并設(shè)置相關(guān)屬性值
   */
  public void count() {
    // 計算總頁數(shù)
    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;

    // 設(shè)置當前頁數(shù)
    // 總頁數(shù)小于當前頁數(shù),應(yīng)將當前頁數(shù)設(shè)置為總頁數(shù)
    if(this.totalPage  this.currentPage) {
      this.currentPage = this.totalPage;
    }
    // 當前頁數(shù)小于1設(shè)置為1
    if(this.currentPage  1) {
      this.currentPage = 1;
    }

    // 設(shè)置limit的參數(shù)
    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、關(guān)鍵的攔截器實現(xiàn)

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元數(shù)據(jù)取得方法名id:com.XXX.queryMessageListByPage
    String id = mappedStatement.getId();
    //匹配在mybatis中定義的與分頁有關(guān)的查詢id
    if (id.matches(".+ByPage$")) {
      //BoundSql中有原始的sql語句和對應(yīng)的查詢參數(shù)
      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)? 因為數(shù)據(jù)表的列是從1開始計數(shù)
        page.setTotalNumber(rs.getInt(1));
        System.out.println("攔截器得知page的記錄總數(shù)為:" + 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就是代購業(yè)務(wù)員(進入方法前是無代理購票能力業(yè)務(wù)員,進入后成為有代理能力的業(yè)務(wù)員)
    // 通過注解獲取攔截目標的信息,如果不符合攔截要求就返回原目標,如果符合則使用動態(tài)代理生成代理對象
    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層相關(guān)的mapper.xml里面的sql語句不用做改動。

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

!--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">

// 點擊分頁按鈕以后觸發(fā)的動作
function handlePaginationClick(new_page_index, pagination_container) {
!--從stuForm表單提交當前頁的參數(shù).可以使用restful方式,讓springmvc使用@PathVariable關(guān)鍵字定義的形參去接。這2個參數(shù)是分頁控件自己提供的,不需要我們?nèi)プ约赫遥怯嫈?shù)從0開始,而我們后臺分頁計數(shù)從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, // 當前顯示第幾頁數(shù)據(jù)
    num_display_entries:8, // 分頁顯示的條目數(shù)
    next_text:"下一頁",
    prev_text:"上一頁",
    num_edge_entries:2, // 連接分頁主體,顯示的條目數(shù)
    callback:handlePaginationClick(當前頁,分頁div的id), //執(zhí)行的回調(diào)函數(shù)
    load_first_page:false //防止頁面一直刷新( 這條非常重要!)
  });
});
/script>
!-- 這部分用c:forEach標簽打印查詢結(jié)果的表格-->
!--分頁控件名稱-->
div id="News-Pagination">/div>

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

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《MyBatis攔截器實現(xiàn)分頁功能的實現(xiàn)方法》,本文關(guān)鍵詞  MyBatis,攔截,器,實現(xiàn),分頁,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MyBatis攔截器實現(xiàn)分頁功能的實現(xiàn)方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于MyBatis攔截器實現(xiàn)分頁功能的實現(xiàn)方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91精品国产一区二区三区香蕉| 色综合色狠狠综合色| 高清不卡在线观看| 色视频欧美一区二区三区| 日韩欧美专区在线| 国产精品美女久久久久av爽李琼| 亚洲成人久久影院| 成人一区二区三区中文字幕| 欧美色综合影院| 一区免费观看视频| 国产精品一区二区久激情瑜伽| 在线欧美日韩国产| 国产精品日产欧美久久久久| 久久国产精品第一页| 91成人在线免费观看| 国产精品午夜免费| 黑人精品欧美一区二区蜜桃| 91麻豆精品国产91久久久使用方法 | 久久综合狠狠综合久久综合88| 亚洲一区二区成人在线观看| 99免费精品视频| 国产三区在线成人av| 麻豆传媒一区二区三区| 3d动漫精品啪啪一区二区竹菊 | 亚洲欧洲日韩av| 国产成人综合在线观看| 日韩欧美一级在线播放| 性感美女久久精品| 欧美日韩二区三区| 亚洲国产精品久久久男人的天堂| 色综合久久久久久久久| 亚洲免费在线视频| 91豆麻精品91久久久久久| 一区二区三区.www| 欧美色偷偷大香| 亚洲自拍与偷拍| 91蜜桃网址入口| 一区二区三区 在线观看视频| 91蝌蚪国产九色| 亚洲欧美日韩中文字幕一区二区三区| 91美女片黄在线观看91美女| 亚洲欧美激情在线| 一本在线高清不卡dvd| 一级做a爱片久久| 欧美日韩午夜影院| 天天色天天爱天天射综合| 91精品国产免费| 激情久久久久久久久久久久久久久久| 精品国产一区二区国模嫣然| 国产精品一区二区男女羞羞无遮挡| 久久精品欧美一区二区三区不卡| 从欧美一区二区三区| 亚洲欧美日韩在线不卡| 欧美日本一道本在线视频| 免费成人在线影院| 久久老女人爱爱| 99精品欧美一区二区蜜桃免费| 亚洲激情av在线| 欧美一区二区三区视频免费| 国产制服丝袜一区| 亚洲三级免费观看| 日韩亚洲欧美高清| av资源网一区| 日韩av网站在线观看| 久久精品夜色噜噜亚洲aⅴ| 97精品电影院| 麻豆成人综合网| 最新国产精品久久精品| 欧美久久高跟鞋激| 成人av在线资源网站| 污片在线观看一区二区| 久久久久99精品一区| 欧美综合天天夜夜久久| 九九九久久久精品| 亚洲黄色尤物视频| 国产亚洲短视频| 欧美三级日韩三级| 国产高清无密码一区二区三区| 亚洲美女在线国产| 欧美电影免费观看高清完整版在线| 国产成人综合在线播放| 日本中文字幕一区| 亚洲乱码国产乱码精品精小说 | 51精品秘密在线观看| 成人一区二区三区在线观看 | 亚洲三级在线看| 欧美一区二区成人6969| 成人av小说网| 久久电影网站中文字幕| 亚洲小说春色综合另类电影| 国产清纯白嫩初高生在线观看91 | 男男成人高潮片免费网站| 自拍av一区二区三区| 国产清纯白嫩初高生在线观看91 | ...av二区三区久久精品| 91久久人澡人人添人人爽欧美| 亚洲免费毛片网站| 国产三级精品视频| 日韩午夜在线观看视频| 欧美中文字幕一区| 91亚洲精品久久久蜜桃网站 | 欧美日韩国产首页在线观看| 成人精品一区二区三区四区| 日韩福利电影在线| 亚洲国产中文字幕在线视频综合 | 中文字幕在线不卡一区| 国产欧美日本一区视频| 精品国产成人系列| 欧美变态口味重另类| 91麻豆精品国产91久久久使用方法| 91精品福利视频| 一本高清dvd不卡在线观看 | 国产91在线看| 国产一区二区免费看| 久久9热精品视频| 久久精品国产精品亚洲红杏 | 国产亚洲欧美中文| 欧美α欧美αv大片| 欧美一级黄色录像| 日韩一区二区在线播放| 91精品福利在线一区二区三区| 91精品啪在线观看国产60岁| 日韩一区二区在线播放| 26uuu成人网一区二区三区| 欧美成va人片在线观看| 久久精品欧美日韩| 国产精品的网站| 樱桃视频在线观看一区| 亚洲精品欧美专区| 亚洲国产aⅴ天堂久久| 视频一区二区不卡| 黄一区二区三区| 国产成人小视频| 91色视频在线| 欧美视频第二页| 精品国产人成亚洲区| 欧美韩日一区二区三区| 亚洲精品写真福利| 日本在线不卡一区| 高清不卡一区二区在线| 欧美性色欧美a在线播放| 91精品啪在线观看国产60岁| 久久尤物电影视频在线观看| 亚洲欧洲日产国产综合网| 首页国产丝袜综合| 国产成人免费视频| 精品视频免费在线| 久久影院视频免费| 一级做a爱片久久| 国产精品一级黄| 欧美在线综合视频| 国产日韩欧美一区二区三区综合| 亚洲综合色网站| 国产真实精品久久二三区| 日本道色综合久久| 精品免费视频.| 亚洲欧美日韩国产综合| 奇米影视在线99精品| 成人高清视频在线观看| 国产一区啦啦啦在线观看| 精品一区二区三区在线观看国产| 99久久精品久久久久久清纯| 精品视频一区二区三区免费| 久久夜色精品国产噜噜av | 日韩欧美国产精品| 久久久久久久久久久久久久久99 | 日本中文在线一区| 国产91精品精华液一区二区三区| 欧美一区日本一区韩国一区| 2022国产精品视频| 国产精品福利影院| 日韩高清电影一区| 欧美中文字幕久久| wwwwxxxxx欧美| 亚洲一区二区欧美日韩 | 日韩av不卡一区二区| 国产成人在线观看| 欧美性猛交xxxx黑人交| 欧美日韩高清一区二区三区| 国产精品美女www爽爽爽| 无吗不卡中文字幕| av电影在线不卡| 五月综合激情婷婷六月色窝| jlzzjlzz欧美大全| 欧美日韩日本视频| 国产三级精品视频| 天堂久久一区二区三区| 色女孩综合影院| 久久九九久精品国产免费直播| 亚洲制服丝袜av| 国产精品影视在线观看| 精品99一区二区| 午夜精品免费在线| 97超碰欧美中文字幕| 日韩欧美一区电影| 九色综合国产一区二区三区| 精品视频一区二区三区免费| 17c精品麻豆一区二区免费| 喷白浆一区二区| 欧美色涩在线第一页|