1. 程式人生 > 其它 >mybatis_SQL對映結果(一對多)

mybatis_SQL對映結果(一對多)

技術標籤:mybatis

資料庫詳情見上一篇

一對多的情況如下:

  • 查詢客戶ID為4的所有訂單的資訊。
    方法一
<mapper namespace="com.blb.mapper.UserMap">
    <!--  一對多 -->
    <resultMap id="aaa" type="Customer">
        <id property="id" column="id"></id>
        <result property=
"name" column="name"></result> <collection property="orders" select="queryOrderById" column="id"></collection> </resultMap> <select id="queryCustomById" resultMap="aaa"> select *
from t_customer where id = #{id} </select> <select id="queryOrderById" resultType="Order"> select * from t_order where c_id = #{id} </select> </mapper>

這種方法比較容易理解,需要查詢兩次才能返回自己所想要的結果。主要是利用自定義結果集resultMap,在collection屬性中使用select屬性關聯另外一張表達查詢方法,column屬性傳遞上一次查詢資料庫的欄位屬性,作為引數傳遞給下一個查詢,變成它所需要的條件。

方法二:

<mapper namespace="com.blb.mapper.UserMap">
    <!--  一對多 -->
    <resultMap id="aaa" type="com.blb.entity.Customer">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <collection property="orders" ofType="com.blb.entity.Order">
            <id property="id" column="oid"></id>
            <result property="orderName" column="order_name"></result>
        </collection>
    </resultMap>
    <select id="getById" resultMap="aaa">
        select c.*, o.id oid, o.order_name from t_customer c, t_order o where c.id = o.c_id and c.id=2
    </select>
</mapper>

這種方法使用起來會更加快速,因為只用查詢一次。同樣也是利用自定義結果集resultMap,但是在collection 屬性中需要用到ofType來指定對應存放資料的實體類,然後繼續將該實體類中的欄位與資料庫中的欄位一一對應起來。值得注意的是,現在利用的是聯合查詢方式,要看資料庫裡查詢的結果顯示的欄位是否有重複。我這裡id有重複,兩個表的主鍵都設定的是id,所以聯合查詢的時候,相同欄位會發生改變不便於觀察。需要使用重新命名的方式查詢,並且將重新命名的欄位寫入collection 屬性裡對應的子類id 屬性對應的column屬性中。
再有一點需要注意到是:collection 屬性裡可以不用新增完整的實體類欄位。前提是查詢語句中的selcet包含該實體類在資料庫中的相應欄位。