程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> mybatis高級映射一對多查詢實現代碼

mybatis高級映射一對多查詢實現代碼

編輯:關於JAVA

mybatis高級映射一對多查詢實現代碼。本站提示廣大學習愛好者:(mybatis高級映射一對多查詢實現代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是mybatis高級映射一對多查詢實現代碼正文


1.需求分析:

在開發中會遇到這樣一個問題,查詢訂單信息,級聯查詢出用戶信息和訂單明細信息

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集合中

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved