您好,登錄后才能下訂單哦!
利用mybatis如何實(shí)現(xiàn)一個一對多查詢功能?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1.需求分析:
在開發(fā)中會遇到這樣一個問題,查詢訂單信息,級聯(lián)查詢出用戶信息和訂單明細(xì)信息
2.sql語句實(shí)現(xiàn)
2.1確定主查詢表:訂單表
2.2確定關(guān)聯(lián)查詢表:用戶表, 訂單明細(xì)表
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;
查詢結(jié)果如下:
映射要求:
不能出現(xiàn)重復(fù)的訂單信息
3.編碼實(shí)現(xiàn)
在orders.java中添加屬性,List<OrdersDetail> ordersDetails 。類比hibernate學(xué)習(xí),代碼如下:
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中,訂單所對應(yīng)的訂單明細(xì)映射到orders的ordersDetails集合中,從上面查詢結(jié)果圖中可以看出最終的訂單信息將為2條(orders信息不重復(fù)),每個訂單orders中的屬性存儲了該訂所對應(yīng)的訂單明細(xì)。
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 { /** * 查詢訂單關(guān)聯(lián)查詢用戶信息和訂單明細(xì)信息 * * @return */ List<Orders> findOrderAndOrderDetailResultMap(); /** * 查詢訂單關(guān)聯(lián)查詢用戶信息 * * @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"> <!--訂單查詢關(guān)聯(lián)用戶和訂單明細(xì)的信息的resultMap--> <resultMap id="orderAndOrderDetailResultMap" type="orders" extends="ordersUserResultMap"> <!--配置訂單信息 使用繼承下面的--> <!--配置訂單關(guān)聯(lián)的用戶信息 使用繼承下面的--> <!--配置訂單關(guān)聯(lián)的訂單明細(xì)信息 一條訂單關(guān)聯(lián)查詢出了多條明細(xì),要使用collection進(jìn)行映射 collection :對關(guān)聯(lián)查詢到多條記錄映射到集合中 property:將關(guān)聯(lián)查詢到的多條記錄映射到com.djp.pojo.Orders中的哪個屬性 ofType:指定映射到list集合屬性中的pojo的類型 --> <collection property="ordersDetails" ofType="OrdersDetail"> <!-- id:訂單明細(xì)的唯一標(biāo)示 property:將訂單明細(xì)的唯一標(biāo)示映射到com.djp.pojo.OrdersDetail中的哪個屬性 --> <id column="orderdetail_id" property="id"/> <result column="orderid" property="orderId"/> <result column="itemsid" property="itemsId"/> </collection> </resultMap> <!--查詢訂單明細(xì)關(guān)聯(lián)查詢用戶信息和訂單明細(xì)信息的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> <!--訂單查詢關(guān)聯(lián)用戶的resultMap 將整個查詢結(jié)果映射到com.djp.pojo.Orders中 --> <resultMap id="ordersUserResultMap" type="com.djp.pojo.Orders"> <!--配置映射的訂單信息 result:普通列 id:指定查詢列中的唯一標(biāo)示,訂單信息中的唯一標(biāo)示,如果有多個列組成多個唯一標(biāo)示,配置多個id column:訂單信息的唯一標(biāo)示 property:訂單信息的唯一標(biāo)示,列所映射到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"/> <!--配置訂單關(guān)聯(lián)的用戶信息 association:用于映射關(guān)聯(lián)查詢單個用戶的信息 property:將要關(guān)聯(lián)查詢的用戶信息映射到orders中的哪個屬性 javaType:指定的類型,可以使用別名 --> <association property="user" javaType="user"> <!-- id :關(guān)聯(lián)查詢用戶的唯一標(biāo)示 column:指定表示用戶信息的列 property:對應(yīng)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> <!-- 查詢訂單關(guān)聯(lián)查詢用戶信息 使用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> <!--查詢訂單關(guān)聯(lián)查詢用戶信息--> <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>
代碼有點(diǎn)多,不怕得,下面的是之前的一對一的,注意繼承至之前寫好的resultMap。
5 寫測試代碼:
/** * 查詢訂單關(guān)聯(lián)查詢用戶信息和訂單明細(xì)信息 */ @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("訂單+用戶+訂單明細(xì):"+item); } } catch (Exception e) { e.printStackTrace(); } }
運(yùn)行結(jié)果如下:
從圖中可看出我們需要的訂單信息,關(guān)聯(lián)查詢出的用戶信息,關(guān)聯(lián)查詢出的訂單明細(xì)信息都出來了!
6 .總結(jié)
mybatis使用resultMap實(shí)現(xiàn)一對多查詢用collection對關(guān)聯(lián)查詢出的多條記錄映射到一個list集合中
關(guān)于利用mybatis如何實(shí)現(xiàn)一個一對多查詢功能問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。