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

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;

查詢結果如下:

選區(qū)_001.png

映射要求:

不能出現重復的訂單信息


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();
        }
    }


運行結果如下:


關聯查詢.png

從圖中可看出我們需要的訂單信息芹助,關聯查詢出的用戶信息,關聯查詢出的訂單明細信息都出來了闲先!

6 .總結

mybatis使用resultMap實現一對多查詢用collection對關聯查詢出的多條記錄映射到一個list集合中

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末状土,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子伺糠,更是在濱河造成了極大的恐慌蒙谓,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件训桶,死亡現場離奇詭異累驮,居然都是意外死亡,警方通過查閱死者的電腦和手機舵揭,發(fā)現死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門谤专,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人午绳,你說我怎么就攤上這事置侍。” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵蜡坊,是天一觀的道長杠输。 經常有香客問我,道長秕衙,這世上最難降的妖魔是什么抬伺? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮灾梦,結果婚禮上,老公的妹妹穿的比我還像新娘妓笙。我一直安慰自己若河,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布寞宫。 她就那樣靜靜地躺著萧福,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辈赋。 梳的紋絲不亂的頭發(fā)上鲫忍,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音钥屈,去河邊找鬼悟民。 笑死,一個胖子當著我的面吹牛篷就,可吹牛的內容都是我干的射亏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼竭业,長吁一口氣:“原來是場噩夢啊……” “哼智润!你這毒婦竟也來了?” 一聲冷哼從身側響起未辆,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤窟绷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咐柜,有當地人在樹林里發(fā)現了一具尸體兼蜈,經...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年炕桨,在試婚紗的時候發(fā)現自己被綠了饭尝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡献宫,死狀恐怖钥平,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤涉瘾,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布知态,位于F島的核電站,受9級特大地震影響立叛,放射性物質發(fā)生泄漏负敏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一秘蛇、第九天 我趴在偏房一處隱蔽的房頂上張望其做。 院中可真熱鬧,春花似錦赁还、人聲如沸妖泄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹈胡。三九已至,卻和暖如春朋蔫,著一層夾襖步出監(jiān)牢的瞬間罚渐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工驯妄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荷并,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓富玷,卻偏偏與公主長得像璧坟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赎懦,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內容