2011年5月29日 星期日

iBatis 教學 - 一對一與一對多

在 ibatis 中如果要操作 1:N 或 1:1 的關聯時,不用像 Hibernate 記很多特殊標籤或屬性

這也是 ibatis 好上手的原因,簡單說它的寫法都很直覺。以下看個 1:1 的例子


<resultMap id="getStudentResult" class=”com.ibatis.example.Product”>
    <result property="student_id" column="STD_ID"/>
    <result property="student_name" column="STD_NAME"/>
    <result property="room" column="STD_ROOM_ID" select="getRoom"/>
</resultMap>

<resultMap id="getRoomResult" class=”com.ibatis.example.Category”>
    <result property="room_id" column="ROOM_ID"/>
    <result property="room_name" column="ROOM_NAME"/>
</resultMap>

<statement id="getStudent" parameterClass="int" resultMap="getStudentResult">
    select * from STUDENT where STD_ID = #value#
</statement>

<statement id="getRoom" parameterClass="int" resultMap="getRoomResult">
    select * from ROOM where ROOM_ID = #value#
</statement>

以上是一個 Sutdent 對應到一間 Room 的一對一關聯,在 Student 物件這邊有 reference 到一個 Room 物件

所以如果我們要撈出某一位 學生時,會針對這個 id 為 getStudent  mapping statemnet 做存取

可以看到它所對應到的 resultMap 中多了一個 room 屬性,如下:

<result property="room" column="STD_ROOM_ID" select="getRoom"/>

column 屬性即是在 table 中的欄位名稱,存放了對應的 ROOM table 的 ROOM_ID


select 屬性告訴了 iBatis 去執行另一個 SELECT 語句。即以上程式的最後一個 mapping statement


以撈出所對應的 Room 物件的資料。


以上就是一個很簡單的 1:1 的映射範例,以下介紹 1:N 的作法


同樣採用上述的例子不過觀點對調,我們從 Room 物件出發,他會有一個 List 屬性


裡面存放了各個的 Student 物件,產生一個一對多的關係。


這裡注意一點的就是,如果要讓一的一方擁有多的一方,則一這方的類別的


集合屬性的型態必須是 java.util.List 或是 java.util.Collection


以下看 SQL MAP 的範例



<resultMap id="getStudentResult" class=”com.ibatis.example.Product”>

    <result property="student_id" column="STD_ID"/>
    <result property="student_name" column="STD_NAME"/>
</resultMap>

<resultMap id="getRoomResult" class=”com.ibatis.example.Category”>
    <result property="room_id" column="ROOM_ID"/>
    <result property="room_name" column="ROOM_NAME"/>
    <result property="students" column="ROOM_ID" select="getStudent"/>
</resultMap>

<statement id="getStudent" parameterClass="int" resultMap="getStudentResult">
    select * from STUDENT where STD_ROOM_ID = #value#
</statement>

<statement id="getRoom" parameterClass="int" resultMap="getRoomResult">
    select * from ROOM where ROOM_ID = #value#
</statement>





直接看看 Room 的 resultMap 的定義,同樣多了一個如下的 result 標籤


<result property="students" column="ROOM_ID" select="getStudent"/>

property 屬性表示了 Room 類別裡的所參照到的 Stduent 物件的屬性集合

column 屬性則表示接下去的 SELECT 語句時要使用的 ID,也就是說會透過

這個 ROOM_ID 去 STUDENT 這個 table 找出所有關聯的 Student 物件

沒有留言:

張貼留言