mybatis_SQL對映結果(一對多)
阿新 • • 發佈:2021-01-09
技術標籤: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包含該實體類在資料庫中的相應欄位。