前面學習了一對一的查詢,如今咱們在剛纔的數據模型基礎上進行一對多的查詢。
一對多查詢
1.需求
查詢訂單及訂單明細的信息。
2.sql語句
肯定主查詢表:訂單表
肯定關聯查詢表:訂單明細表
在一對一查詢基礎上添加訂單明細表關聯便可。html
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
3.分析
使用resultType將上邊的 查詢結果映射到pojo中,訂單信息的就是重複。
java
如圖mysql
要求:
對orders映射不能出現重複記錄。
4.在orders中添加list訂單明細屬性
在orders.java類中添加List<orderDetail> orderDetails屬性。
最終會將訂單信息映射到orders中,訂單所對應的訂單明細映射到orders中的orderDetails屬性中。
sql
package cn.edu.hpu.mybatis.PO; import java.util.Date; import java.util.List; public class Orders { private Integer id; private Integer userId; private String number; private Date creattime; private String note; //用戶信息 private User user; //訂單明細 private List<Orderdetail> orderdetils; //get和set方法省略 }
其中Orderdetail爲
mybatis
package cn.edu.hpu.mybatis.PO; public class Orderdetail { private int id; private int orders_id; private int items_id; private int items_num; //get和set方法省略 }映射成的orders記錄數爲兩條(orders信息不重複)
每一個orders中的orderDetails屬性存儲了該訂單所對應的訂單明細。
5.mapper.xml
app
<pre name="code" class="html"><!-- 查詢訂單關聯查詢用戶信息以及訂單明細,使用resultMap --> <select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap"> 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 </select>
6.resultMap定義學習
<!-- 訂單及訂單明細的resultMap 使用extend繼承,不用在此中配置訂單信息和用戶信息的映射 --> <resultMap type="cn.edu.hpu.mybatis.PO.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap"> <!-- 使用extend繼承,不用在此中配置訂單信息和用戶信息的映射 --> <!-- 訂單明細信息 一個訂單關聯查詢出了多個明細,要使用 collection進行映射 collection:對關聯查詢到多條記錄映射cn.edu.hpu.mybatis.PO.Orders哪一個屬性 ofType:指定要映射到的集合屬性中pojo的類型(就是一個List<Orderdetail>的尖括號中的類型) --> <collection property="orderdetils" ofType="cn.edu.hpu.mybatis.PO.Orderdetail"> <!-- id:訂單明細的惟一標識 --> <id column="orderdetail_id" property="id"/> <result column="items_id" property="items_id"/> <result column="items_num" property="items_num"/> <result column="orders_id" property="orders_id"/> </collection> </resultMap>7.mapper.java
package cn.edu.hpu.mybatis.mapper; import java.util.List; import cn.edu.hpu.mybatis.PO.Orders; import cn.edu.hpu.mybatis.PO.OrdersCustom; //訂單mapper public interface OrdersCustomMapper { //... //查詢訂單(關聯查詢用戶)及訂單明細使用resultMap public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception; }8.測試:
@Test public void testFindOrdersAndOrderDetailResultMap() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); //建立代理對象 OrdersCustomMapper ordersMapperCustom=sqlSession.getMapper(OrdersCustomMapper.class); //調用mapper的方法 List<Orders> list=ordersMapperCustom.findOrdersAndOrderDetailResultMap(); for (int i = 0; i < list.size(); i++) { Orders o=list.get(i); User u=o.getUser(); System.out.println("\n下單用戶:"); System.out.println(u.getUsername()+"|"+u.getSex()+"|"+u.getAddress()); System.out.println("訂單明細:"); List<Orderdetail> os=o.getOrderdetils(); if(os!=null){ for (int j = 0; j < os.size(); j++) { Orderdetail od=os.get(j); System.out.println("訂單id:"+od.getOrders_id()+ "商品id:"+od.getItems_id()+"訂單總數:"+od.getItems_num()); } } } sqlSession.close(); }
下單用戶:
張三|男|河南焦做
訂單明細:
訂單id:1商品id:1訂單總數:2
下單用戶:
張三|男|河南焦做
訂單明細:
訂單id:2商品id:2訂單總數:2
下單用戶:
劉莉莉|女|山東威海
訂單明細:
訂單id:3商品id:3訂單總數:1
日誌輸出:
測試
DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 18135083. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@114b82b] DEBUG [main] - ==> Preparing: 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 DEBUG [main] - ==> Parameters: DEBUG [main] - <== Total: 3
測試成功!
9.小結
mybatis使用resultMap的collection對關聯查詢的多條記錄映射到一個list集合屬性中。
使用resultType實現:代理
將訂單明細映射到orders中的orderdetails中,須要本身處理,使用雙重循環遍歷,去掉重複記錄,將訂單明細放在orderdetails中。日誌