多對多查詢
1.需求
查詢用戶及用戶購買商品信息。
2.sql語句
查詢主表是:用戶表
關聯表:因爲用戶和商品沒有直接關聯,經過訂單和訂單明細進行關聯,因此關聯表:
orders、orderdetail、itemsjava
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
3.映射思路
將用戶信息映射到user中。
在user類中添加訂單列表屬性List<Orders> orderslist,將用戶建立的訂單映射到orderslist
在Orders中添加訂單明細列表屬性List<OrderDetail>orderdetials,將訂單的明細映射到orderdetials
在OrderDetail中添加Items屬性,將訂單明細所對應的商品映射到Items
4.mapper.xmlmysql
<!-- 查詢用戶及購買的商品信息,使用resultMap --> <select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap"> 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 </select>
5.resultMap定義sql
<!-- 查詢用戶及購買的商品 --> <resultMap type="cn.edu.hpu.mybatis.PO.User" id="UserAndItemsResultMap"> <!-- 用戶信息 --> <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="cn.edu.hpu.mybatis.PO.Orders"> <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="creattime" property="creattime"/> <result column="note" property="note"/> <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"/> <association property="items" javaType="cn.edu.hpu.mybatis.PO.Items"> <id column="items_id" property="id"/> <result column="items_name" property="name"/> <result column="items_price" property="price"/> <result column="items_detail" property="detail"/> </association> </collection> </collection> </resultMap>
6.mapper.javamybatis
package cn.edu.hpu.mybatis.mapper; import java.util.List; import cn.edu.hpu.mybatis.PO.Orders; import cn.edu.hpu.mybatis.PO.OrdersCustom; import cn.edu.hpu.mybatis.PO.User; //訂單mapper public interface OrdersCustomMapper { //... //查詢用戶及用戶商品信息 public List<User> findUserAndItemsResultMap() throws Exception; }
7.測試app
//查詢用戶及用戶購買的商品信息 @Test public void testFindUserAndItemsResultMap() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); //建立代理對象 OrdersCustomMapper ordersMapperCustom=sqlSession.getMapper(OrdersCustomMapper.class); //調用mapper的方法 List<User> list=ordersMapperCustom.findUserAndItemsResultMap(); for (int i = 0; i < list.size(); i++) { User u=list.get(i); System.out.println("\n下單用戶:"); System.out.println(u.getUsername()+"|"+u.getSex()+"|"+u.getAddress()); System.out.println("訂單明細:"); List<Orders> os=u.getOrdersList(); if(os!=null){ for (int j = 0; j < os.size(); j++) { Orders order=os.get(j); List<Orderdetail> ol=order.getOrderdetils(); for (int k = 0; k < ol.size(); k++) { Orderdetail od=ol.get(k); System.out.println("訂單明細id:"+od.getOrders_id()+ " 商品id:"+od.getItems_id()+" 訂單總數:"+od.getItems_num()); Items items=od.getItems(); System.out.println("商品詳細信息:\n"+" 商品id:"+items.getId() +" 商品名稱:"+items.getName()+" 商品價格:"+items.getPrice() +"\n商品詳細信息:"+items.getDetail()); } } } } sqlSession.close(); }
測試結果:
下單用戶:
張三|男|河南焦做
訂單明細:
訂單明細id:1 商品id:1 訂單總數:2
商品詳細信息:
商品id:1 商品名稱:電視機 商品價格:2500.0
商品詳細信息:等離子電視機,液晶屏幕
訂單明細id:2 商品id:2 訂單總數:2
商品詳細信息:
商品id:2 商品名稱:洗衣機 商品價格:1300.0
商品詳細信息:雙滾筒洗衣機,馬力十足
下單用戶:
劉莉莉|女|山東威海
訂單明細:
訂單明細id:3 商品id:3 訂單總數:1
商品詳細信息:
商品id:3 商品名稱:電冰箱 商品價格:3200.0
商品詳細信息:雙拉門電冰箱,智能保鮮功能
測試
日誌輸出:代理
DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 29071960. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1bb9a58] DEBUG [main] - ==> Preparing: 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 DEBUG [main] - ==> Parameters: DEBUG [main] - <== Total: 3
8.多對多查詢總結
將查詢用戶購買的商品信息明細清單,(用戶名、用戶地址、購買商品名稱、購買商品時間、購買商品數量)
針對上邊的需求就使用resultType將查詢到的記錄映射到一個擴展的pojo中,很簡單實現明細清單的功能。
一對可能是多對多的特例,以下需求:
查詢用戶購買的商品信息,用戶和商品的關係是多對多關係。
需求1:
查詢字段:用戶帳號、用戶名稱、用戶性別、商品名稱、商品價格(最多見)
企業開發中常見明細列表,用戶購買商品明細列表,
使用resultType將上邊查詢列映射到pojo輸出。
需求2:
查詢字段:用戶帳號、用戶名稱、購買商品數量、商品明細(鼠標移上顯示明細)
使用resultMap將用戶購買的商品明細列表映射到user對象中。
總結:
日誌
使用resultMap是針對那些對查詢結果映射有特殊要求的功能,好比特殊要求映射成list中包括 多個list。code