jdbc mybatis使用游標

2021-10-13 10:28:46 字數 3142 閱讀 3737

1、對於游標的理解

游標是資料庫提供的一種獲取大量資料的方案,它可以讓使用者在獲取大量資料過程中減少io次數。對比分頁獲取資料方式,游標通過臨時表的方式儲存查詢結果,所以游標指向的不是實際查詢到的資料,因此游標總是唯讀的。

2、游標的使用

比如我的資料庫中有乙個表:t_pol_logdata,這個表有大概400萬資料,下面分別通過幾種方式舉例使用不同方案獲取資料

1、通過jdbc使用游標

long starttime = system.currenttimemillis();

system.out.println("開始讀取資料:" + datetimeutils.formatdatetime(new date()));

connection conn = null;

preparedstatement pstmt = null;

resultset rs = null;

int count = 0;

try

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

}system.out.println("讀取資料完成:" + datetimeutils.formatdatetime(new date()));

system.out.println("******************************==jdbc游標獲取資料【" + count + "】共計用時******************************==");

2、通過mybatis使用游標

mybatis使用游標也很簡單,第一步寫游標獲取介面:

@options(fetchsize = 5000)

@select("select fid as id,fname as name from t_pol_logdata where 1=1 order by fid asc")

cursorfindlogdatabycursor();

這裡只是舉乙個簡單的例子,複雜的sql語句通過xml檔案做對映

第二步在呼叫的方法中獲取游標,並通過遍歷游標獲取資料:

@transactional

public void testbycursor(string key)

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

} long endtime = system.currenttimemillis();

system.out.println("讀取資料完成:" + datetimeutils.formatdatetime(new date()));

system.out.println("******************************==mybatis游標獲取資料【" + count + "】共計用時******************************==");

long diff = endtime - starttime;

system.out.println(diff + " ms");

}

這裡需要注意一點,在呼叫方法上要加上@transactional註解

3、分頁獲取資料

@select("select count(*) from t_pol_logdata where 1=1")

int findlogdatapagecount();

@select("select * from ( select t1.*,rownum rn from (select * from t_pol_logdata where 1=1 order by fid asc) t1 where rownum <= #) t1 where rn > #")

cursorfindlogdatabycursor(@param(value = "start") int start, @param(value = "end") int end);

第二步迴圈獲取資料:

long starttime = system.currenttimemillis();

system.out.println("開始讀取資料:" + datetimeutils.formatdatetime(new date()) + "|" + total);

int size = 5000;

int count = 0;

try }}

} catch (exception e)

long endtime = system.currenttimemillis();

system.out.println("讀取資料完成:" + datetimeutils.formatdatetime(new date()));

system.out.println("******************************==分頁獲取資料【" + count + "】共計用時******************************==");

總結:通過上面獲取資料方式可知,游標方式在獲取大量資料時還是比較有優勢的,基本上效能提公升了乙個數量級,這是因為分頁獲取資料是每次都去資料庫中獲取資料,然後捨棄掉不用的資料,在這個過程中越分頁到後面越浪費資源,因為查詢出的大量資料都捨棄掉;而游標則不同,它通過臨時表方式儲存查詢出來的資料,通過空間換取時間,這裡也有乙個例外情況,當臨時表空間不足時,資料庫會建乙個臨時磁碟表來存放,這種情況下效能也會很糟。

使用游標 引數游標

參游標是指帶有引數的游標。在定義了引數游標之後,當使用不同引數值多次開啟游標時,可以生成不同的結果集。定義引數游標的語法如下 cursor cursor name parameter name datetype is select statement 注意,當定義引數游標時,游標引數只能指定資料型別...

使用游標 游標FOR迴圈

游標for迴圈是在pl sql塊中使用游標最簡單的方式,它簡化了對游標的處理。當使用游標for迴圈時,oracle會隱含的開啟游標,提取游標資料並關閉游標。例子 顯示emp表所有雇員名及其工資 declare cursor emp cursor isselect ename,sal from emp...

MYSQL使用游標

一 使用游標 一 宣告游標。delare cursor name cursor for select statement 解釋 cursor name是游標的名字 select statement表示select語句。因為游標需要遍歷結果集的每一行,增加了伺服器的負擔,導致游標的效率並不高效,如果使...