溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

利用mybatis如何實(shí)現(xiàn)一個一對多查詢功能

發(fā)布時(shí)間:2020-11-17 15:29:05 來源:億速云 閱讀:174 作者:Leah 欄目:編程語言

利用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é)果如下:

利用mybatis如何實(shí)現(xiàn)一個一對多查詢功能

映射要求:

不能出現(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的解釋加在了代碼中 ,如下:

<&#63;xml version="1.0" encoding="UTF-8" &#63;>
<!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é)果如下:

利用mybatis如何實(shí)現(xiàn)一個一對多查詢功能

從圖中可看出我們需要的訂單信息,關(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)知識。

向AI問一下細(xì)節(jié)

免責(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)容。

AI