Mybatis 游標使用總結

2021-09-29 23:45:57 字數 1361 閱讀 6415

背景:

當查詢百萬級的資料的時候,查詢出所有資料並放入記憶體中時會發生oom(outofmemoryexception),使用游標可以節省記憶體的消耗,不需要一次性取出所有資料,可以進行逐條處理或逐條取出部分批量處理,在此場景下就可以使用游標的概念來解決這個問題。

什麼是游標:

游標(cursor)是處理資料的一種方法,為了檢視或者處理結果集中的資料,游標提供了在結果集中一次一行或者多行前進或向後瀏覽資料的能力。

demo:

// 第一種

@options(resultsettype = resultsettype.forward_only)

@select("select * from department where status = 0")

listquerydepartmentall();

// 第二種 在mybatis-3.4.0版本中,不支援@select註解,在3.4.1版本中已經修復:

@options(resultsettype = resultsettype.forward_only)

@select("select * from department where status = 0")

cursorcursorquerydepartmentall();

@service

public class departmentserviceimpl implements departmentservice );

// 也可以使用迭代器:iteratoriterator = cursor.iterator();

} catch (exception e) finally catch (exception e)

}if (null != sqlsession) catch (exception e) }}

}}

resultset.type_forword_only 結果集的游標只能向下滾動。

resultset.type_scroll_insensitive 結果集的游標可以上下移動,當資料庫變化時,當前結果集不變。

resultset.type_scroll_sensitive 返回可滾動的結果集,當資料庫變化時,當前結果集同步改變。 

注意:游標是可以前後移動的。如果resultsettype = type_scroll_insensitive ,就是設定游標就可以前後移動。mybatis為了保證可以前後移動,mybatis會把之前查詢的資料一直儲存在記憶體中。所以並不能根本解決oom,所以我們這裡需要設定為@options(resultsettype = resultsettype.forward_only)(其實預設就是resultsettype.forward_only)

mybatis使用游標返回list

實際開發中,什麼時候會用到儲存過程,像網上說的簡單求和?我覺得不是,那樣簡單的例子根本就不能拿來學習儲存過程,那是一條sql就能搞定的事,沒必要動儲存過程大駕,當我們開發的過程中,遇到很複雜的業務邏輯時,而我們只想傳些引數進去,想動態的得到返回結果,在儲存過程裡面去寫好實際的業務問題,動態的拼sql...

Mybatis游標Cursor查詢

通常對一張表中大量資料處理時由於資料量太大都要使用分頁分批查詢處理,否則資料量太大會導致oom等問題。cursor查詢適用於這種場景下可以替代分頁查詢的方案,cursor實現了closeable和iterable介面,我們可以通過迭代器來獲取資料進行處理。public inte ce cursore...

Oracle 游標的使用總結

declare 定義游標 cursor tcount is select to number to char d create,yyyy as fyear,vc code as fsetid,l fundid as fsetcode,vc name as fsetname,nvl to number...