1、一對多查詢
1.1 需求
查詢訂單及訂單明細的信息。
1.2 sql語句
確定主查詢表:訂單表
確定關聯查詢表:訂單明細表
在一對一查詢基礎上添加訂單明細表關聯即可。
SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
1.3 分析
使用resultType將上邊的 查詢結果映射到pojo中,訂單信息的就是重復。
要求:
對orders映射不能出現重復記錄。
在orders.java類中添加List<orderDetail> orderDetails屬性。
最終會將訂單信息映射到orders中,訂單所對應的訂單明細映射到orders中的orderDetails屬性中。
每個orders中的orderDetails屬性存儲了該 訂單所對應的訂單明細。
1.4 在orders中添加list訂單明細屬性
1.5 修改mapper.xml
1.6 resultMap定義
<!-- 查詢訂單,關聯用戶信息以及訂單明細的resultMap --> <!-- extends:繼承,不用再配置訂單信息及用戶信息 --> <resultMap type="com.joe.mybatis.entities.Orders" id="OrderAndOrderDetailResultMap" extends="OrderCustomResultMap"> <!-- 配置映射的訂單信息 --> <!-- 配置映射關聯的用戶信息 --> <!-- 訂單明細信息 --> <!-- 一個訂單關聯查詢出了多條訂單明細,用使用collection進行映射 collection:對關聯查詢到的多條記錄映射到集合對象中 property:將關聯查詢得到的多條記錄映射到com.joe.mybatis.entities.Orders類中的哪個屬性上 ofType:指定映射到List集合的pojo的類型 --> <collection property="orderDetails" ofType="com.joe.mybatis.entities.OrderDetail"> <!-- id:訂單明細的唯一標識 --> <!--property: 要將訂單明細中的唯一標示映射到com.joe.mybatis.entities.OrderDetail類的哪個屬性 --> <id column="orderdetail_id" property="id" /> <result column="items_id" property="itemsId" /> <result column="items_num" property="itemsNum" /> <result column="orders_id" property="ordersId" /> </collection> </resultMap>
1.7 mapper.java
1.8 小結
mybatis使用resultMap的collection對關聯查詢的多條記錄映射到一個list集合屬性中。
使用resultType實現:
將訂單明細映射到orders中的orderdetails中,需要自己處理,使用雙重循環遍歷,去掉重復記錄,將訂單明細放在orderdetails中。
2、多對多查詢
2.1 需求
查詢用戶及用戶購買商品信息。
2.2 sql語句
查詢主表是:用戶表
關聯表:由於用戶和商品沒有直接關聯,通過訂單和訂單明細進行關聯,所以關聯表:
orders、orderdetail、items
SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, items.name items_name, items.detail items_detail, items.price items_price FROM orders, USER, orderdetail, items WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id
2.3 映射思路
將用戶信息映射到user中。
在user類中添加訂單列表屬性List<Orders> orderslist,將用戶創建的訂單映射到orderslist
在Orders中添加訂單明細列表屬性List<OrderDetail>orderdetials,將訂單的明細映射到orderdetials
在OrderDetail中添加Items屬性,將訂單明細所對應的商品映射到Items
2.4 mapper.xml
2.5 resultMap定義
<!-- 查詢用戶及商品情況的resultMap --> <resultMap type="com.joe.mybatis.entities.User" id="UserAndItemsResultMap"> <!-- 用戶的唯一標識 --> <!-- column:指定唯一標識用戶信息的數據列 property:映射到user的哪個屬性 --> <id column="user_id" property="id" /> <result column="username" property="username" /> <result column="sex" property="sex" /> <result column="address" property="address" /> <!-- 訂單信息 --> <collection property="ordersList" ofType="com.joe.mybatis.entities.Orders"> <!-- 配置映射的訂單信息 --> <!-- 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" /> <!-- 訂單明細:一個訂單含有一個或多個訂單明細 --> <!-- 一個訂單關聯查詢出了多條訂單明細,用使用collection進行映射 collection:對關聯查詢到的多條記錄映射到集合對象中 property:將關聯查詢得到的多條記錄映射到com.joe.mybatis.entities.Orders類中的哪個屬性上 ofType:指定映射到List集合的pojo的類型 --> <collection property="orderDetails" ofType="com.joe.mybatis.entities.OrderDetail"> <!-- id:訂單明細的唯一標識 --> <!--property: 要將訂單明細中的唯一標示映射到com.joe.mybatis.entities.OrderDetail類的哪個屬性 --> <id column="orderdetail_id" property="id" /> <result column="items_id" property="itemsId" /> <result column="items_num" property="itemsNum" /> <result column="orders_id" property="ordersId" /> <!-- 商品信息,一個明細對應一個商品 --> <association property="items" javaType="com.joe.mybatis.entities.Items"> <id column="items_id" property="id"/> <result column="items_name" property="name"/> <result column="items_detail" property="detail"/> <result column="items_price" property="price"/> </association> </collection> </collection> </resultMap>
2.6 mapper.java
2.7 多對多查詢總結
將查詢用戶購買的商品信息明細清單,(用戶名、用戶地址、購買商品名稱、購買商品時間、購買商品數量)
針對上邊的需求就使用resultType將查詢到的記錄映射到一個擴展的pojo中,很簡單實現明細清單的功能。
一對多是多對多的特例,如下需求:
查詢用戶購買的商品信息,用戶和商品的關系是多對多關系。
需求1:
查詢字段:用戶賬號、用戶名稱、用戶性別、商品名稱、商品價格(最常見)
企業開發中常見明細列表,用戶購買商品明細列表,
使用resultType將上邊查詢列映射到pojo輸出。
需求2:
查詢字段:用戶賬號、用戶名稱、購買商品數量、商品明細(鼠標移上顯示明細)
使用resultMap將用戶購買的商品明細列表映射到user對象中。
總結:
使用resultMap是針對那些對查詢結果映射有特殊要求的功能,,比如特殊要求映射成list中包括 多個list。
3、resultMap總結
3.1 resultType:
作用:
將查詢結果按照sql列名pojo屬性名一致性映射到pojo中。
場合:
常見一些明細記錄的展示,比如用戶購買商品明細,將關聯查詢信息全部展示在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list(list中是pojo)即可。
3.2 resultMap:
使用association和collection完成一對一和一對多高級映射(對結果有特殊的映射要求)。
3.2.1 association:
作用:
將關聯查詢信息映射到一個pojo對象中。
場合:
為了方便查詢關聯信息可以使用association將關聯訂單信息映射為用戶對象的pojo屬性中,比如:查詢訂單及關聯用戶信息。
使用resultType無法將查詢結果映射到pojo對象的pojo屬性中,根據對結果集查詢遍歷的需要選擇使用resultType還是resultMap。
3.2.2 collection:
作用:
將關聯查詢信息映射到一個list集合中。
場合:
為了方便查詢遍歷關聯信息可以使用collection將關聯信息映射到list集合中,比如:查詢用戶權限范圍模塊及模塊下的菜單,可使用collection將模塊映射到模塊list中,將菜單列表映射到模塊對象的菜單list屬性中,這樣的作的目的也是方便對查詢結果集進行遍歷查詢。
如果使用resultType無法將查詢結果映射到list集合中。