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對多。對於一般的情況來說,這兩種已經足夠了,當然不能層疊更新是乙個缺陷,看了半天文件,也...