亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Mybatis之RowBounds分頁(yè)原理詳解

 更新時(shí)間:2020年02月01日 14:48:45   作者:祖大俊  
這篇文章主要介紹了Mybatis之RowBounds分頁(yè)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Mybatis可以通過(guò)傳遞RowBounds對(duì)象,來(lái)進(jìn)行數(shù)據(jù)庫(kù)數(shù)據(jù)的分頁(yè)操作,然而遺憾的是,該分頁(yè)操作是對(duì)ResultSet結(jié)果集進(jìn)行分頁(yè),也就是人們常說(shuō)的邏輯分頁(yè),而非物理分頁(yè)。

RowBounds對(duì)象的源碼如下:

public class RowBounds {

 public static final int NO_ROW_OFFSET = 0;
 public static final int NO_ROW_LIMIT = Integer.MAX_VALUE;
 public static final RowBounds DEFAULT = new RowBounds();

 private int offset;
 private int limit;

 public RowBounds() {
  this.offset = NO_ROW_OFFSET;
  this.limit = NO_ROW_LIMIT;
 }

 public RowBounds(int offset, int limit) {
  this.offset = offset;
  this.limit = limit;
 }

 public int getOffset() {
  return offset;
 }

 public int getLimit() {
  return limit;
 }

}

對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)進(jìn)行分頁(yè),依靠offset和limit兩個(gè)參數(shù),表示從第幾條開(kāi)始,取多少條。也就是人們常說(shuō)的start,limit。

下面看看Mybatis的如何進(jìn)行分頁(yè)的。

org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap()方法源碼。

 private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping)
   throws SQLException {
  DefaultResultContext<Object> resultContext = new DefaultResultContext<Object>();
  // 跳到offset位置,準(zhǔn)備讀取
  skipRows(rsw.getResultSet(), rowBounds);
  // 讀取limit條數(shù)據(jù)
  while (shouldProcessMoreRows(resultContext, rowBounds) && rsw.getResultSet().next()) {
   ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(rsw.getResultSet(), resultMap, null);
   Object rowValue = getRowValue(rsw, discriminatedResultMap);
   storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet());
  }
 }
 
  private void skipRows(ResultSet rs, RowBounds rowBounds) throws SQLException {
  if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
   if (rowBounds.getOffset() != RowBounds.NO_ROW_OFFSET) {
    // 直接定位
    rs.absolute(rowBounds.getOffset());
   }
  } else {
   // 只能逐條滾動(dòng)到指定位置
   for (int i = 0; i < rowBounds.getOffset(); i++) {
    rs.next();
   }
  }
 }

說(shuō)明,Mybatis的分頁(yè)是對(duì)結(jié)果集進(jìn)行的分頁(yè)。

假設(shè)查詢(xún)結(jié)果總共是100條記錄,而我們只需要分頁(yè)后的10條,是不是意味著100條記錄在內(nèi)存中,我們對(duì)內(nèi)存分頁(yè)獲得了10條數(shù)據(jù)呢?

非也,JDBC驅(qū)動(dòng)并不是把所有結(jié)果加載至內(nèi)存中,而是只加載小部分?jǐn)?shù)據(jù)至內(nèi)存中,如果還需要從數(shù)據(jù)庫(kù)中取更多記錄,它會(huì)再次去獲取部分?jǐn)?shù)據(jù),這就是fetch size的用處。和我們從銀行卡里取錢(qián)是一個(gè)道理,卡里的錢(qián)都是你的,但是我們一次取200元,用完不夠再去取,此時(shí)我們的fetch size = 200元。

因此,Mybatis的邏輯分頁(yè)性能,并不像很多人想的那么差,很多人認(rèn)為是對(duì)內(nèi)存進(jìn)行的分頁(yè)。

最優(yōu)方案,自然是物理分頁(yè)了,也就是查詢(xún)結(jié)果,就是我們分頁(yè)后的結(jié)果,性能是最好的。如果你一定要物理分頁(yè),該如何解決呢?

1. Sql中帶有offset,limit參數(shù),自己控制參數(shù)值,直接查詢(xún)分頁(yè)結(jié)果。

2. 使用第三方開(kāi)發(fā)的Mybatis分頁(yè)插件。

3. 修改Mybatis源碼,給Sql追加自己的物理分頁(yè)Subsql。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java異常分類(lèi)以及幾種處理機(jī)制分析講解

    Java異常分類(lèi)以及幾種處理機(jī)制分析講解

    在Java的廣闊宇宙中,有一群特殊的“超級(jí)英雄”,它們?cè)诖a世界中穿梭,守護(hù)著程序的正常運(yùn)行——它們就是“異?!?這些英雄們,各司其職,保護(hù)著程序免受錯(cuò)誤的侵?jǐn)_,今天,我們將深入這個(gè)神秘的世界,全面解析異常的分類(lèi),掌握異常的處理機(jī)制
    2024-07-07
  • Java利用字符流輕松處理文本數(shù)據(jù)

    Java利用字符流輕松處理文本數(shù)據(jù)

    在Java中,文本數(shù)據(jù)是經(jīng)常處理的一種數(shù)據(jù)類(lèi)型,而字符流就是用來(lái)處理文本數(shù)據(jù)的一種流,下面就為大家介紹一下Java字符流的基本概念、常用類(lèi)和方法,以及如何使用字符流來(lái)讀寫(xiě)文件吧
    2023-09-09
  • 淺談mybatis中的#和$的區(qū)別 以及防止sql注入的方法

    淺談mybatis中的#和$的區(qū)別 以及防止sql注入的方法

    下面小編就為大家?guī)?lái)一篇淺談mybatis中的#和$的區(qū)別 以及防止sql注入的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • RocketMQ NameServer 核心源碼解析

    RocketMQ NameServer 核心源碼解析

    這篇文章主要為大家介紹了RocketMQ NameServer 核心源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java工具包之Lombok使用

    Java工具包之Lombok使用

    這篇文章主要介紹了Java工具包之Lombok使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Java實(shí)現(xiàn)API sign簽名校驗(yàn)的方法詳解

    Java實(shí)現(xiàn)API sign簽名校驗(yàn)的方法詳解

    為了防止中間人攻擊,有時(shí)我們需要進(jìn)行API sign 簽名校驗(yàn)。本文將用Java語(yǔ)言實(shí)現(xiàn)API sign 簽名校驗(yàn),感興趣的小伙伴可以嘗試一下
    2022-07-07
  • SpringBoot整合PowerJob實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度

    SpringBoot整合PowerJob實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度

    最近項(xiàng)目需要使用定時(shí)任務(wù),而使用了PowerJob做任務(wù)調(diào)度模塊,感覺(jué)這個(gè)框架真香,今天我們就來(lái)深入了解一下新一代的定時(shí)任務(wù)框架——PowerJob,需要的朋友可以參考下
    2024-03-03
  • JavaWeb文件上傳流程

    JavaWeb文件上傳流程

    這篇文章主要介紹了JavaWeb文件上傳流程,JavaWeb中最重要的技術(shù)之一,下文關(guān)于其文件上傳的流程分享,需要的小伙伴可以參考一下
    2022-05-05
  • JDK15正式發(fā)布(新增功能預(yù)覽)

    JDK15正式發(fā)布(新增功能預(yù)覽)

    這篇文章主要介紹了JDK15正式發(fā)布,新增功能預(yù)覽,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 100行java寫(xiě)的微信跳一跳輔助程序

    100行java寫(xiě)的微信跳一跳輔助程序

    本篇文章給大家分享了用java寫(xiě)的一個(gè)微信跳一跳輔助腳本程序,有興趣的朋友參考學(xué)習(xí)下。
    2018-01-01

最新評(píng)論