2011年5月21日 星期六

iBatis 教學 - resultMap 的運用

在 iBatis 中,執行查詢語句時,回傳的結果多為 ResultMap 來處理

通常 ResultMap 能夠將 SELECT 出的結果列值 映射到 Javabean 的屬性值上  以下看看一個簡單的範例


<resultMap id="allProductManager" class="org.pojo.ProductManager">
        <result property="id" column="PM_ID"/>
        <result property="account" column="PM_ACCOUNT"/>
        <result property="name" column="PM_NAME"/>
        <result property="idcode" column="PM_IDCODE" nullValue="-1"/>
</resultMap>


resultMap 的標籤中 id 屬性能夠讓 select 或是其他的 statement 進行識別,所以切記它要唯一

class 屬性告訴 resultMap 要將結果映射到哪個 Javabean 上

在 resultMap 的內容區還要加上 result 標籤才能將資料表的欄位和 Javabean 的屬性作關聯

result 標籤除了 column 和 property 屬性之外,大概還有如下列的其他屬性

1. nullValue : 當此欄位在資料表中為 null 時,映射到 Javabean 時就以 nullValue 的值表示

2. javaType : 通常在正常情況下都會透過反射而得到 Javabean 的屬性型態

3. select : 這個屬性值必須是一個 mapped Statement 的操作(之後再論)

介紹完之後,其實通常我們可以不用像上述這樣寫一個 resultMap 來接收

可以直接用隱式的 resultMap 來定義,如以下所示 直接在 select 標籤中表示


<select id="getPM" parameterClass="int" resultClass="org.pojo.ProductManager">
        SELECT 
        PM_ID as id,
        PM_ACCOUNT as account,
        PM_NAME as name,
        PM_IDCODE as idcode 
        FROM t_pm WHERE id = #value#
</select>

以上的 mapped Statement 定義了一個 ResultMap 屬性,並且替每個欄位取了別名用來與 ProductManager 的屬性作關聯˙

而 resultMap 也可以直接接收 Java 的基本型態,如:String、Integer、boolean

甚至他還能接收 Java 的 Map 型態,如:HashMap


<resultMap id="allProductManager" class="java.util.HashMap">
        <result property="id" column="PM_ID"/>
        <result property="account" column="PM_ACCOUNT"/>
        <result property="name" column="PM_NAME"/>
        <result property="idcode" column="PM_IDCODE" nullValue="-1"/>
</resultMap>


通常會透過 executeQueryForList() 的方法取得所有結果並放入一個 List 如下程式所示
List list = (List)sqlMapClient.queryForList("getPM");
Iterator iterator = list.iterator();
while(iterator.hasNext()){
    Map map = (Map)iterator.next();  //List 裡面是一個個 Map 物件
    System.out.println(map.get("name"));   //name 為其中一個 key
}

之後再介紹複雜類型屬性 !

1 則留言: