上一篇文章我們講解了《Mybatis—動態sql(六)》下面我們繼續來講解高級映射,即一對一查詢,一對多查詢,多對多查詢。
【訂單商品數據模型】
我們要對Mybatis講解高級映射的內容,首先要對數據庫中的各個表進行分析。
1、數據模型分析思路
(1)每張表記錄的數據內容
分模塊對每張表記錄的內容進行熟悉,相當 於你學習系統 需求(功能)的過程。
(2)每張表重要的字段設置
非空字段、外鍵字段
(3)數據庫級別表與表之間的關係
外鍵關係
(4)表與表之間的業務關係
在分析表與表之間的業務關係時一定要建立 在某個業務意義基礎上去分析。
2、數據模型分析
(1)用戶表user:
記錄了購買商品的用戶信息
訂單表:orders
記錄了用戶所創建的訂單(購買商品的訂單)
訂單明細表:orderdetail:
記錄了訂單的詳細信息即購買商品的信息
商品表:items
記錄了商品信息
(2)表與表之間的業務關係:
1)在分析表與表之間的業務關係時需要建立 在某個業務意義基礎上去分析。
先分析數據級別之間有關係的表之間的業務關係:
①usre和orders:
user—->orders:一個用戶可以創建多個訂單,一對多
orders—>user:一個訂單隻由一個用戶創建,一對一
②orders和orderdetail:
orders—》orderdetail:一個訂單可以包括 多個訂單明細,因爲一個訂單可以購買多個商品,每個商品的購買信息在orderdetail記錄,一對多關係
orderdetail–> orders:一個訂單明細只能包括在一個訂單中,一對一
③orderdetail和itesm:
orderdetail—》itesms:一個訂單明細只對應一個商品信息,一對一
items–> orderdetail:一個商品可以包括在多個訂單明細 ,一對多
2)再分析數據庫級別沒有關係的表之間是否有業務關係:
orders和items:
orders和items之間可以通過orderdetail表建立關係。
【一對一查詢】
1、 需求
查詢訂單信息,關聯查詢創建訂單的用戶信息
2、resultType
①sql語句
確定查詢的主表:訂單表
確定查詢的關聯表:用戶表
關聯查詢使用內鏈接?還是外鏈接?
由於orders表中有一個外鍵(user_id),通過外鍵關聯查詢用戶表只能查詢出一條記錄,可以使用內鏈接。
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
②創建pojo
將上邊sql查詢的結果映射到pojo中,pojo中必須包括所有查詢列名。
原始的Orders.java不能映射全部字段,需要新創建的pojo。
創建 一個pojo繼承包括查詢字段較多的po類。
③mapper.xml
<!-- 查詢訂單關聯查詢用戶信息 -->
<select id="findOrdersUser" resultType="cn.itcast.mybatis.po.OrdersCustom">
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
</select>
④mapper.java
//查詢訂單關聯查詢用戶信息
public List<OrdersCustom> findOrdersUser()throws Exception;
3、resultMap
①sql語句
同resultType實現的sql
②使用resultMap映射的思路
使用resultMap將查詢結果中的訂單信息映射到Orders對象中,在orders類中添加User屬性,將關聯查詢出來的用戶信息映射到orders對象中的user屬性中。
③需要Orders類中添加user屬性
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//用戶信息
private User user;
}
④mapper.xml
定義resultMap
<!-- 訂單查詢關聯用戶的resultMap
將整個查詢的結果映射到cn.itcast.mybatis.po.Orders中
-->
<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">
<!-- 配置映射的訂單信息 -->
<!-- id:指定查詢列中的唯 一標識,訂單信息的中的唯 一標識,如果有多個列組成唯一標識,配置多個id
column:訂單信息的唯 一標識 列
property:訂單信息的唯 一標識 列所映射到Orders中哪個屬性
-->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!-- 配置映射的關聯的用戶信息 -->
<!-- association:用於映射關聯查詢單個對象的信息
property:要將關聯查詢的用戶信息映射到Orders中哪個屬性
-->
<association property="user" javaType="cn.itcast.mybatis.po.User">
<!-- id:關聯查詢用戶的唯 一標識
column:指定唯 一標識用戶信息的列
javaType:映射到user的哪個屬性
-->
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap>
statement定義
<!-- 查詢訂單關聯查詢用戶信息,使用resultmap -->
<select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
</select>
⑤mapper.java
//查詢訂單關聯查詢用戶使用resultMap
public List<Orders> findOrdersUserResultMap()throws Exception;
4、resultType和resultMap實現一對一查詢小結
①resultType:使用resultType實現較爲簡單,如果pojo中沒有包括查詢出來的列名,需要增加列名對應的屬性,即可完成映射。
如果沒有查詢結果的特殊要求建議使用resultType。
②resultMap:需要單獨定義resultMap,實現有點麻煩,如果對查詢結果有特殊的要求,使用resultMap可以完成將關聯查詢映射pojo的屬性中。
③resultMap可以實現延遲加載,resultType無法實現延遲加載。
好了小編今天的總結就到這裏了。。歡迎關注下面的內容《Mybatis—高級映射之一對多和多對多查詢(八)》。