前一陣一直在看iBatis,也準(zhǔn)備將其引入項目的開發(fā)中,感覺由于使用直接sql映射對象的方式,對于熟悉sql的人來說上手十分方便。這里整理了一下學(xué)習(xí)中的心得,iBatis的文檔還是十分不錯的,而且還有中文版,這個在開源工具中真是不多見的,但愿以后這樣的情況能越來越多:)

 

 

一、Statement

1、  Mapped Statementid是全局的,在各個xml文件內(nèi)都可以直接使用。

 

二、parameter

1、  parameterMap 一般可用parameterClassinline 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、  使用parameterMapprarmeterClass的區(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

1resultClass 只要JavaBean的屬性名與字段名相同,自動匹配。

   限制:

1)  無法指定字段的數(shù)據(jù)類型

2)  無法自動轉(zhuǎn)入相關(guān)數(shù)據(jù)(復(fù)雜類型、1:nn:m

2、  resultMap 最常用與最重要的屬性

1)  columnIndex 在某些jdbcType driver的情況下可提高性能

jdbcType       resultMap沒有null值問題,但是用來作為數(shù)據(jù)映射類型只用(如:將Sting——>Varcharcharblob等)

javaType       一般用于指定轉(zhuǎn)換到mapxml的類型映射

select       用于描述對象間關(guān)系(1:11: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.Lstjava.util.Collection。只能使用這2個接口,因為iBatis內(nèi)部使用的是動態(tài)代理。

2、使用延遲加載和字節(jié)碼增強來優(yōu)化查詢,對于11的,可以使用聯(lián)合查詢來替代

3、對于1MNM的性能問題,沒有很好的解決辦法,在性能要求比較高時,考慮少用。

4、對于1Mxml

  Resultmap的設(shè)置

id="result" class="exsample.dao.domain.Category">

    property="categoryId" column="catid"/>

    property="name" column="name"/>

    property="description" column="descn"/>

    property="productList" column="catid" select="getProductsByCategoryId"/>

 

  Select的設(shè)置

  id="getProduct" resultMap="result">

    select productid, name, descn, category from product where productid = #value#

 

 

五、緩存

1、只讀緩存,可讓多用戶共享,性能更好

2Serializble可讀寫緩存,不能與延遲緩存同時使用,因為延遲加載代理是不支持Serializble

3、緩存類型

類型

說明

Memory

缺省week

能打打提高常用查詢的性能

jvm中內(nèi)存管理的可達性模型,數(shù)據(jù)可能垃圾收集器清除,不會造成內(nèi)存不足。

Lru

不要cache太多對象,可能會造成內(nèi)存不足。

Fifo

OSCACHE

第三方包,功能強大,需自己配置

 

六、動態(tài)Mapped Statement

1Iterator$……$ 連用可以自動實現(xiàn)很多復(fù)雜的sql

2、對于Iterator的傳入?yún)?shù),在sql中需要寫成#value[]#的形式

3、在sql#……#用于帶入sql中的參數(shù),$……$用于帶入sql中的關(guān)鍵字、字段名等

  id="getProductsByLike" resultMap="result">

    select productid, name, descn, category from product

    prepend="where">

      prepend="and" property="productIdList"    open="(" close=")" conjunction="OR">

    productid = #productIdList[]#

     

      prepend="and" property="descList"    open="(" close=")" conjunction="OR">

    descn $operator$ #descList[]#

     

     

   

 

3、  若要直接生成全部的sql,可以使用如下形式:

  id="getProductsBySQL" resultClass="java.util.HashMap">

    $value$

 

  其中value為傳入的sql

  返回result,可以是map,若沒有做resultMap映射,則返回的字段在map中的鍵值都為大寫。