mybatis 實現關聯查詢的一對多和多對多查詢
1.1 一對多查詢
案例:查詢所有訂單資訊及訂單下的訂單明細資訊。
訂單資訊與訂單明細為一對多關係。
使用resultMap實現如下:
1.1.1 Sql語句:三張表的關聯查詢標紅的分別為查詢欄位,查詢的表,關聯查詢的條件
SELECTorders.*,
user.username,
user.address,
orderdetail.idorderdetail_id,
orderdetail.items_id,
orderdetail.items_num
FROM
orders, user, orderdetail
WHEREorders.user_id = user.id
AND orders.id = orderdetail.orders_id
1.1.2 定義po類 orderdetails 用來一對多的對映訂單明細資訊,明細資訊對映到orderdetails集合中去
在Orders類中加入User屬性。
在Orders類中加入List<Orderdetail> orderdetails屬性
1.1.3 Mapper.xml
<selectid="findOrdersDetailList"resultMap="userorderdetailmap">
SELECT
orders.*,
user.username,
user.address,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num
FROM orders,user,orderdetail
WHERE orders.user_id = user.id
AND orders.id = orderdetail.orders_id
</select>
1.1.4 定義resultMap association一對一對映collection一對多對映
cn.itcast.mybatis.po.Orders 查詢主體 <id/>為關聯查詢的條件,既唯一標識;
<result/>為查詢的欄位
<!-- 訂單資訊resultmap -->
<resultMaptype="cn.itcast.mybatis.po.Orders"id="userorderdetailmap">
<idproperty="id"column="id"/>
<resultproperty="user_id"column="user_id"/>
<resultproperty="number"column="number"/>
<association property="user"javaType="cn.itcast.mybatis.po.User">
<idproperty="id"column="user_id"/>
<resultproperty="username"column="username"/>
<resultproperty="address"column="address"/>
</association>
<collection property="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">
<idproperty="id"column="orderdetail_id"/>
<resultproperty="items_id"column="items_id"/>
<resultproperty="items_num"column="items_num"/>
</collection>
</resultMap>
collection部分定義了查詢訂單明細資訊。
collection:表示關聯查詢結果集
property="orderdetails":關聯查詢的結果集儲存在cn.itcast.mybatis.po.Orders上哪個屬性。
ofType="cn.itcast.mybatis.po.Orderdetail":指定關聯查詢的結果集中的物件型別即List中的物件型別。
<id />及<result/>的意義同一對一查詢。
1.1.4.1 resultMap使用繼承
上邊定義的resultMap中黃色部分和上一篇部落格一對一查詢訂單資訊的resultMap相同,在同一工程裡使用繼承可以不再填寫重複的內容,如下:
<resultMaptype="cn.itcast.mybatis.po.Orders"id="userorderdetailmap"extends="userordermap">
<collectionproperty="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">
<idproperty="id"column="orderdetail_id"/>
<resultproperty="items_id"column="items_id"/>
<resultproperty="items_num"column="items_num"/>
</collection>
</resultMap>
使用extends繼承訂單資訊userordermap。
1.1.5 Mapper介面:
public List<Orders>findOrdersDetailList() throws Exception;
1.1.6 測試:
Public void testfindOrdersDetailList()throws Exception{
//獲取session
SqlSession session = sqlSessionFactory.openSession();
//獲限mapper介面例項
UserMapper userMapper = session.getMapper(UserMapper.class);
//查詢訂單資訊
List<Orders> list = userMapper.findOrdersDetailList();
System.out.println(list);
//關閉session
session.close();
}
1.2 多對多查詢
1.2.1.1 需求
查詢使用者購買的商品資訊。
1.2.1.2 sql
需要查詢所有使用者資訊,關聯查詢訂單及訂單明細資訊,訂單明細資訊中關聯查詢商品資訊
四張表表的關聯查詢
SELECT
orders.*,
USER.username,
USER.address,
orderdetail.idorderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
items.nameitems_name,
items.detailitems_detail
FROM
orders,
USER,
orderdetail,
items
WHERE
orders.user_id =USER .id
AND orders.id = orderdetail.orders_id
AND orderdetail.items_id = items.id
1.2.1.3 po定義
在User中新增List<Orders> orders 屬性,在Orders類中加入List<Orderdetail> orderdetails屬性
1.2.1.4 resultMap
需要關聯查詢對映的資訊是:訂單、訂單明細、商品資訊
訂單:一個使用者對應多個訂單,使用collection對映到使用者物件的訂單列表屬性中
訂單明細:一個訂單對應多個明細,使用collection對映到訂單物件中的明細屬性中
商品資訊:一個訂單明細對應一個商品,使用association對映到訂單明細物件的商品屬性中。
思路:
將使用者資訊對映到user中。
在user類中新增訂單列表屬性List<Orders> orderslist,將使用者建立的訂單對映到orderslist
在Orders中新增訂單明細列表屬性List<OrderDetail>orderdetials,將訂單的明細對映到orderdetials
在OrderDetail中新增Items屬性,將訂單明細所對應的商品對映到Items
<!-- 一對多查詢
查詢使用者資訊、關聯查詢訂單、訂單明細資訊、商品資訊
-->
<resultMap type="cn.itcast.mybatis.po.User"id="userOrderListResultMap">
<idcolumn="user_id"property="id"/>
<resultcolumn="username"property="username"/>
<collectionproperty="orders"ofType="cn.itcast.mybatis.po.Orders">
<id column="id"property="id"/>
<resultproperty="number"column="number"/>
<collectionproperty="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">
<id column="orderdetail_id"property="id"/>
<resultproperty="ordersId"column="id"/>
<resultproperty="itemsId"column="items_id"/>
<resultproperty="itemsNum"column="items_num"/>
<associationproperty="items"javaType="cn.itcast.mybatis.po.Items">
<idcolumn="items_id"property="id"/>
<resultcolumn="items_name"property="name"/>
<resultcolumn="items_detail"property="detail"/>
</association>
</collection>
</collection>
</resultMap>
1.2.1.5 mapper.Xml
<!-- 查詢使用者及購買的商品資訊 -->
<selectid="findUserAndItemsResultMap"resultMap="UserAndItemsResultMap">
SELECTorders.* ,
user.username, user.sex , user.address ,
orderdetail.orders_id, orderdetail.items_id , orderdetail.items_num , orderdetail.id orderdetail_id,
items.nameitems_name , items.detail items_detail , items.price items_price
FROM orders ,USER , orderdetail , items
WHEREorders.user_id=user.id AND orderdetail.orders_id = orders.id AND orderdetail.items_id=items.id
</select>
1.2.1.6 mapper介面
//查詢使用者購買的商品資訊
public List<User> findUserAndItemsResultMap()throwsxception;
1.2.1.7 測試通過resultMap去重列印
//查詢使用者購買的商品資訊
@Test
public voidtestFindUserAndItemsResultMap() throwsException{
SqlSessionsqlSession=sqlSessionFactory.openSession();
OrdersMapperCustom ordersMapperCustom=sqlSession.getMapper(OrdersMapperCustom.class);
List<User>list=ordersMapperCustom.findUserAndItemsResultMap();
Stringresult="";
for(inti=0;i<list.size();i++)
{
result="使用者 "+list.get(i).getUsername();
for(intj=0;j<list.get(i).getOrderList().size();j++)
{
result=result+"訂單id "+list.get(i).getOrderList().get(j).getId();
for(intk=0;k<list.get(i).getOrderList().get(j).getOrderdetails().size();k++)
{
result=result+" "+list.get(i).getOrderList().get(j).getOrderdetails().get(k).getItems().getName()+"價格 "+
+list.get(i).getOrderList().get(j).getOrderdetails().get(k).getItems().getPrice();
}
}
System.out.println(result);//去重
}
sqlSession.close();
}
總結自傳智部落格燕青老師的視訊