一、Statement
1、 Mapped Statement的id是全局的,在各個xml文件內(nèi)都可以直接使用。
二、parameter
1、 parameterMap 一般可用parameterClass和inline parameter替代,此外動態(tài)Mapped Statement只支持inline parameter
其中:
jdbcType 在字段可以為Null時才需要。在orcale中,若沒有設(shè)置,插入null會報錯。
插入的jdbcType可參考java.sql.Type中定義的類型名稱。
parameterMap的名稱是局部的,在其他xml文件中引用,必須以“前綴.名稱”的形式
2、 parameterClass建議使用,可優(yōu)化框架性能。Class的值需是全限定的java類名
3、 使用parameterMap與prarmeterClass的區(qū)別:parameterMap允許null的替換值
4、 inline parameter 更靈活,可簡化定義與代碼量。
在內(nèi)嵌參數(shù)中,可以指定parameterMap中有的所有屬性。此外,在需要指定null的替換值時,必須先指定jdbcType。
insert into category(CATID, NAME, DESCN)
values(#categoryId#,#name#,#description:VARCHAR#)
需要指定很多字段的時候,可以使用外部parameterMap,這樣可使代碼更清晰
三、result
1、resultClass 只要JavaBean的屬性名與字段名相同,自動匹配。
限制:
1) 無法指定字段的數(shù)據(jù)類型
2) 無法自動轉(zhuǎn)入相關(guān)數(shù)據(jù)(復(fù)雜類型、1:n、n:m)
2、 resultMap 最常用與最重要的屬性
1) columnIndex: 在某些jdbcType driver的情況下可提高性能
jdbcType : resultMap沒有null值問題,但是用來作為數(shù)據(jù)映射類型只用(如:將Sting——>Varchar、char、blob等)
javaType : 一般用于指定轉(zhuǎn)換到map和xml的類型映射
select : 用于描述對象間關(guān)系(1:1,1:m)
2) 隱式resultMap 即只用resultClass,一般用于簡單的映射關(guān)系。
缺點:
無法指定字段的數(shù)據(jù)類型
無法指定null值替代
對于Bean中屬性大小寫不敏感(由于數(shù)據(jù)庫本身就不是大小寫敏感的)
此外,resultClass的自動映射會影響性能(輕微)
3) Re’sultMap的名稱是局部的
4) Map類型的result,在resultMap定義只類名寫成java.util.HashMap
四、復(fù)雜類型(1:N,N:M)
1、復(fù)雜類型集合的屬性(JavaBean中的屬性)必須是java.util.Lst或java.util.Collection。只能使用這2個接口,因為iBatis內(nèi)部使用的是動態(tài)代理。
2、使用延遲加載和字節(jié)碼增強來優(yōu)化查詢,對于1:1的,可以使用聯(lián)合查詢來替代
3、對于1:M、N:M的性能問題,沒有很好的解決辦法,在性能要求比較高時,考慮少用。
4、對于1:M的xml:
Resultmap的設(shè)置
Select的設(shè)置
select productid, name, descn, category from product where productid = #value#
五、緩存
1、只讀緩存,可讓多用戶共享,性能更好
2、Serializble可讀寫緩存,不能與延遲緩存同時使用,因為延遲加載代理是不支持Serializble的
3、緩存類型
類型 |
說明 |
Memory |
缺省week。 能打打提高常用查詢的性能 用jvm中內(nèi)存管理的可達性模型,數(shù)據(jù)可能垃圾收集器清除,不會造成內(nèi)存不足。 |
Lru |
不要cache太多對象,可能會造成內(nèi)存不足。 |
Fifo | |
OSCACHE |
第三方包,功能強大,需自己配置 |
六、動態(tài)Mapped Statement
1、Iterator與$……$ 連用可以自動實現(xiàn)很多復(fù)雜的sql
2、對于Iterator的傳入?yún)?shù),在sql中需要寫成#value[]#的形式
3、在sql中#……#用于帶入sql中的參數(shù),$……$用于帶入sql中的關(guān)鍵字、字段名等
select productid, name, descn, category from product
productid = #productIdList[]#
descn $operator$ #descList[]#
3、 若要直接生成全部的sql,可以使用如下形式:
$value$
其中value為傳入的sql
返回result,可以是map,若沒有做resultMap映射,則返回的字段在map中的鍵值都為大寫。