iBatis一對多 分頁詳解

2021-07-22 07:34:32 字數 3243 閱讀 6400

ibatis分頁詳解

相關配置

1.ibatis version: 2.3.4.

2.資料庫是oracle 12g.

3.前端js為ext.js 3.3.2

分頁sql

1.count 查詢:select count(*) from preordertds_page_

temp

2.result查詢:

select wht.* from

( select pt.* from preordertds_page_

temp pt

property

="startrow"

>

where pt.rown ]]> #startrow# and pt.rown #endrow#

isnotempty

>

) ht 

left join preordertds_with_

history_temp wht on wht.process_

instance_id = ht.process_

instance_id

說明:先查詢出一對多的sql 定義為臨時表with_history_temp, 然後用distinct 查詢出主鍵或唯一鍵排序:

page_temp as ( select pt.*, rownum rown from (select distinct id from with_history_temp order by id) pt)

再回看上面的sql。

還有一種比較複雜的方法,可能對某些功能管用(將一對多的列合併起來用『,』分隔開):

select

n_sec_code, translate (

ltrim

(text, '

/'), '*/'

, '*,'

) researcherlist

from

(select

row_number () 

over

(partition 

byn_sec_code 

order

byn_sec_code,

lvl 

desc

) rn,

n_sec_code, 

text

from

(select

n_sec_code, 

level

lvl,

sys_connect_by_path (c_researcher_code,'/

') text

from

(select

n_sec_code, c_researcher_code 

asc_researcher_code,

row_number () 

over

(partition 

byn_sec_code 

order

byn_sec_code,c_researcher_code) x

from

m_researcher_stock_rel

order

byn_sec_code, c_researcher_code) a

connect 

byn_sec_code 

=prior n_sec_code 

andx 

-1

=prior x))

where

rn =

1

order

byn_sec_code;

m_researcher_stock_rel > table_name,

n_sec_code > 主鍵或唯一鍵,

c_researcher_code > 要合併的列

然後count 這個sql 分頁就可以了

注意事項:sys_connect_by_path 字元引數不能是列內容中包含的字元。

select * from 

(select a.*, rownum rn 

from (select * from table_name) a 

where rownum <= 40

)where rn >= 21

其中最內層的查詢

select * from table_name

表示不進行翻頁的原始查詢語句。

rownum <= 40

和rn >= 21

控制分頁查詢的每頁的範圍。

上面給出的這個分頁查詢語句,在大多數情況擁有較高的效率。分頁的目的就是控制輸出結果集大小,將結果盡快的返回。在上面的分頁查詢語句中,這種考慮主要體現在

where rownum <= 40

這句上。

選擇第21到

40條記錄存在兩種方法,一種是上面例子中展示的在查詢的第二層通過

rownum <= 40

來控制最大值,在查詢的最外層控制最小值。而另一種方式是去掉查詢第二層的

where rownum <= 40

語句,在查詢的最外層控制分頁的最小值和最大值。這是,查詢語句如下:

select * from 

(select a.*, rownum rn 

from (select * from table_name) a 

)where rn between 21 and 40

對比這兩種寫法,絕大多數的情況下,第乙個查詢的效率比第二個高得多。

這是由於

cbo優化模式下,

oracle

可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。對於第乙個查詢語句,第二層的查詢條件

where rownum <= 40

就可以被

oracle

推入到內層查詢中,這樣

oracle

查詢的結果一旦超過了

rownum

限制條件,就終止查詢將結果返回了。

而第二個查詢語句,由於查詢條件

between 21 and 40

是存在於查詢的第三層,而

oracle

無法將第三層的查詢條件推到最內層(即使推到最內層也沒有意義,因為最內層查詢不知道

rn代表什麼)。因此,對於第二個查詢語句,

oracle

最內層返回給中間層的是所有滿足條件的資料,而中間層返回給最外層的也是所有資料。資料的過濾在最外層完成,顯然這個效率要比第乙個查詢低得多。

ibatis的一對多查詢

在mybatis中,遇到需要一對多和多對多查詢的物件封裝,可以使用標籤載入 而在mybatis的前身ibatis中,不支援該標籤,要進行類似的封裝可以使用resultmap屬性載入 在mybatis中如下的配置 ibatis不支援標籤,可以用下列的方法,效果一致 用groupby屬性代替標籤 直接在...

ibatis配置多表關聯(一對一 一對多 多對多)

ibatis的多表關聯。ibatis的表關聯,和資料庫語句無關,是在程式中,把若干語句的結果關聯到一起。這種關聯形式,雖然在大資料量時是很奢侈的行為,但是看起來很乾淨,用起來也很方便。這裡用表lock和key為例,乙個lock可以配多個key。create table lock id int,loc...

ibatis 物件關係實現,一對多,多對一

hibernate 的強大在於完全的物件化,對於物件之間的關係解決的比較好,如1對1,1對多,多對1,以及多對多。當然也包括繼承關係。而ibatis這方面就比較遜色了,不過對於也支援簡單的關連查詢,如1對1,和1對多。對於一般的情況來說,這兩種已經足夠了,當然不能層疊更新是乙個缺陷,看了半天文件,也...