1.需求分析:
在開發(fā)中會遇到這樣一個問題,查詢訂單信息娄帖,級聯查詢出用戶信息和訂單明細信息
2.sql語句實現
2.1確定主查詢表:訂單表
2.2確定關聯查詢表:用戶表也祠, 訂單明細表
sql語句如下:
select
orders.*,
t_user.address,
t_user.name,
t_user.brithday,
orderdetail.id orderdetail_id,
orderdetail.orderid,
orderdetail.itemsid
from
orders,
t_user,
orderdetail
where
orders.userid=t_user.id AND orderdetail.orderid=orders.id;
查詢結果如下:
映射要求:
不能出現重復的訂單信息
3.編碼實現
在orders.java中添加屬性,List<OrdersDetail> ordersDetails 近速。類比hibernate學習诈嘿,代碼如下:
public class Orders {
private int id;
private String note;
private Date dateTime;
private String number;
private int userId;
private User user;
private List<OrdersDetail> ordersDetails;//看這里
}
最終會將訂單信息映射到orders中,訂單所對應的訂單明細映射到orders的ordersDetails集合中削葱,從上面查詢結果圖中可以看出最終的訂單信息將為2條(orders信息不重復)奖亚,每個訂單orders中的屬性存儲了該訂所對應的訂單明細。
4.編寫mapper.java和mapper.xml文件
代碼如下:
package com.djp.config.mapper;
import com.djp.pojo.Orders;
import com.djp.pojo.OrdersCustom;
import java.util.List;
public interface OrdersCustomMapper {
/**
* 查詢訂單關聯查詢用戶信息和訂單明細信息
*
* @return
*/
List<Orders> findOrderAndOrderDetailResultMap();
/**
* 查詢訂單關聯查詢用戶信息
*
* @return
*/
List<OrdersCustom> findOrderUser() throws Exception;
/**
* 使用resultMap映射
*
* @return
* @throws RuntimeException
*/
List<Orders> findOrderUserResultMap() throws RuntimeException;
}
對于mapper.xml的解釋加在了代碼中 ,如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.djp.config.mapper.OrdersCustomMapper">
<!--訂單查詢關聯用戶和訂單明細的信息的resultMap-->
<resultMap id="orderAndOrderDetailResultMap" type="orders" extends="ordersUserResultMap">
<!--配置訂單信息 使用繼承下面的-->
<!--配置訂單關聯的用戶信息 使用繼承下面的-->
<!--配置訂單關聯的訂單明細信息
一條訂單關聯查詢出了多條明細析砸,要使用collection進行映射
collection :對關聯查詢到多條記錄映射到集合中
property:將關聯查詢到的多條記錄映射到com.djp.pojo.Orders中的哪個屬性
ofType:指定映射到list集合屬性中的pojo的類型
-->
<collection property="ordersDetails" ofType="OrdersDetail">
<!--
id:訂單明細的唯一標示
property:將訂單明細的唯一標示映射到com.djp.pojo.OrdersDetail中的哪個屬性
-->
<id column="orderdetail_id" property="id"/>
<result column="orderid" property="orderId"/>
<result column="itemsid" property="itemsId"/>
</collection>
</resultMap>
<!--查詢訂單明細關聯查詢用戶信息和訂單明細信息的statement-->
<select id="findOrderAndOrderDetailResultMap" resultMap="orderAndOrderDetailResultMap">
select
orders.*,
t_user.address,
t_user.name,
t_user.brithday,
orderdetail.id orderdetail_id,
orderdetail.orderid,
orderdetail.itemsid
from
orders,
t_user,
orderdetail
where
orders.userid=t_user.id AND orderdetail.orderid=orders.id
</select>
<!--訂單查詢關聯用戶的resultMap
將整個查詢結果映射到com.djp.pojo.Orders中
-->
<resultMap id="ordersUserResultMap" type="com.djp.pojo.Orders">
<!--配置映射的訂單信息
result:普通列
id:指定查詢列中的唯一標示躯泰,訂單信息中的唯一標示琐脏,如果有多個列組成多個唯一標示蜕衡,配置多個id
column:訂單信息的唯一標示
property:訂單信息的唯一標示突硝,列所映射到Orders中的哪個屬性
-->
<id column="id" property="id"/>
<result column="note" property="note"/>
<result column="dateTime" property="dateTime"/>
<result column="number" property="number"/>
<result column="userId" property="userId"/>
<!--配置訂單關聯的用戶信息
association:用于映射關聯查詢單個用戶的信息
property:將要關聯查詢的用戶信息映射到orders中的哪個屬性
javaType:指定的類型,可以使用別名
-->
<association property="user" javaType="user">
<!--
id :關聯查詢用戶的唯一標示
column:指定表示用戶信息的列
property:對應user.java中的哪個屬性
-->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="pwd"/>
<result column="address" property="address"/>
<result column="brithday" property="brithday"/>
</association>
</resultMap>
<!-- 查詢訂單關聯查詢用戶信息 使用resultMap-->
<select id="findOrderUserResultMap" resultMap="ordersUserResultMap">
select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id
</select>
<!--查詢訂單關聯查詢用戶信息-->
<select id="findOrderUser" resultType="OrdersCustom">
select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id
</select>
</mapper>
代碼有點多蛮瞄,不怕得所坯,下面的是之前的一對一的,注意繼承至之前寫好的resultMap挂捅。
5 寫測試代碼:
/**
* 查詢訂單關聯查詢用戶信息和訂單明細信息
*/
@Test
public void testFindOrderAndOrderDetailResultMap() {
try {
System.out.println("start.................");
//通過得到的SqlSessionFactory打開回話sqlSession
SqlSession sqlSession = SqlSessionFactory.openSession();
//通過會話得到用戶的代理
OrdersCustomMapper ordersCustomMapper = sqlSession.getMapper(OrdersCustomMapper.class);
List<Orders> list = ordersCustomMapper.findOrderAndOrderDetailResultMap();
for (Orders item : list) {
System.out.println("訂單+用戶+訂單明細:"+item);
}
} catch (Exception e) {
e.printStackTrace();
}
}
運行結果如下:
從圖中可看出我們需要的訂單信息芹助,關聯查詢出的用戶信息,關聯查詢出的訂單明細信息都出來了闲先!
6 .總結
mybatis使用resultMap實現一對多查詢用collection對關聯查詢出的多條記錄映射到一個list集合中