高級映射-一對多查詢-多對多查詢

一 一對多查詢-概述
1 需求
  • 查詢訂單及訂單明細(xì)
2 sql語句:
  • 確定主查詢表:訂單表 orders
  • 確定關(guān)聯(lián)查詢表:訂單明細(xì)表 Orderdetail
    SELECT
     orders.*,
     user.username,
     user.sex,
     user.address,
     orderdetail.id orderdetail_id,
     orderdetail.items_id,
     orderdetail.item_num,
     orderdetail.orders_id
    FROM
     orders,
     USER,
     orderdetail
    WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
sql語句執(zhí)行結(jié)果
3 要求
  • 對orders映射不能出現(xiàn)重復(fù)記錄
4 思路
  • 在orders.java類中添加List<orderDetail>orderDetail屬性
  • 最終會將訂單信息映射到orders中譬重,訂單所對應(yīng)的訂單明細(xì)映射到orders中的ordersDetail屬性中邻梆。
  • 映射成的orders記錄數(shù)為三條(orders信息不重復(fù))
  • 每個orders中的orderDetails屬性存儲了該訂單所對應(yīng)的訂單明細(xì)
二 一對多查詢-實現(xiàn)
1 在orders.java類中添加List<OrderdetailBean>OrderdetailBean屬性拆魏,并生成get和set方法
OrdersBean添加List集合
2 OrdersMapperCustom
<?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="dao.OrdersMapperCustom">
    <!--訂單查詢關(guān)聯(lián)用戶的resultMap-->
    <resultMap id="OrdersUserResultMap" type="entity.OrdersBean">
        <!--配置映射的訂單信息-->
        <id column="id" property="id"></id>
        <result column="user_id" property="user_id"></result>
        <result column="number" property="number"></result>
        <result column="createtime" property="createtime"></result>
        <result column="note" property="note"></result>
        <!--配置映射的關(guān)聯(lián)的用戶信息-->
        <!--association:用于映射關(guān)聯(lián)查詢單個對象的信息
        property:要將關(guān)聯(lián)查詢的用戶信息映射到Orders中哪個屬性-->
        <association property="userBean" javaType="entity.UserBean">
            <!--id:關(guān)聯(lián)查詢用戶的唯一標(biāo)識
            column:指定唯一標(biāo)識用戶信息的列
            javaType:映射到user的那個屬性-->
            <id column="user_id" property="id"></id>
            <result column="username" property="username"></result>
            <result column="sex" property="sex"></result>
            <result column="address" property="address"></result>
        </association>
    </resultMap>
    <!--查詢訂單關(guān)聯(lián)用戶及訂單明細(xì),使用resultMap-->
    <resultMap id="OrdersAndOrderdetailResultMap" type="entity.OrdersBean" extends="OrdersUserResultMap">
        <!--訂單信息-->
        <!--用戶信息-->


        <!--明細(xì)信息
        一個訂單關(guān)聯(lián)查詢出多條明細(xì),要使用collection進(jìn)行映射
        collection:對關(guān)聯(lián)查詢到的多條記錄映射到集合對象
        property:將關(guān)聯(lián)查詢到的多條記錄映射到OrdersBean屬性
        ofType:指定映射到集合屬性的poio的類型
        -->
        <collection property="orderdetailBeans" ofType="entity.OrderdetailBean">
            <!--id:訂單明細(xì)唯一標(biāo)識-->
            <id column="orderdetail_id" property="id"></id>
            <result column="items_id" property="orders_id"></result>
            <result column="items_id" property="items_id"></result>
            <result column="orders_id" property="orders_id"></result>
        </collection>
    </resultMap>
    <!--查詢訂單關(guān)聯(lián)查詢用戶信息,使用resultType-->
    <select id="findOrdersUser" resultType="pojo.OrdersCustom">
    SELECT orders.*,user.username,user.sex,user.address FROM user,orders WHERE orders.user_id = user.id
</select>
    <!--查詢訂單關(guān)聯(lián)查詢用戶信息舶掖,使用resultMap-->
    <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
    SELECT orders.*,user.username,user.sex,user.address FROM user,orders WHERE orders.user_id = user.id
</select>
    <!--查詢訂單關(guān)聯(lián)用戶及訂單明細(xì),使用resultMap-->
    <select id="findOrdersAndOrderdetailResultMap" resultMap="OrdersAndOrderdetailResultMap">
    SELECT
     orders.*,
     user.username,
     user.sex,
     user.address,
     orderdetail.id orderdetail_id,
     orderdetail.items_id,
     orderdetail.item_num,
     orderdetail.orders_id
    FROM
     orders,
     USER,
     orderdetail
    WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
    </select>
</mapper>
3 OrdersMapperCustom接口
public List<OrdersBean> findOrdersAndOrderdetailResultMap() throws Exception;
4 OrdersMapperTest 測試
    @Test
    public void findOrdersAndOrderdetailResultMap() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
        List<OrdersBean> ordersBeans = ordersMapperCustom.findOrdersAndOrderdetailResultMap();
        System.out.println(ordersBeans);
    }
測試結(jié)果
三 多對多查詢-概述
1 需求
  • 查詢用戶及用戶購買商品信息
2 sql語句

查詢主表是:用戶表
關(guān)聯(lián)表:由于用戶和商品沒有直接關(guān)聯(lián)尔店,通過訂單和訂單明細(xì)進(jìn)行關(guān)聯(lián)访锻,所以關(guān)聯(lián)表orders,orderdetail闹获,items

SELECT
     orders.*,
     user.username,
     user.sex,
     user.address,
     orderdetail.id orderdetail_id,
     orderdetail.items_id,
     orderdetail.item_num,
     orderdetail.orders_id,
     items.name items_name,
     items.detail items_detail,
     items.price items_price
    FROM
     orders,
     USER,
     orderdetail,
     items
    WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id
3 思路
  • 將用戶信息映射到user中期犬。
  • 在UserBean類中添加訂單列表屬性List<OrdersBean> ordersBean,將用戶創(chuàng)建的訂單映射到ordersBean避诽。
  • 在OdersBean中添加訂單明細(xì)列表屬性List<OrderDetailBean> orderDetailBeans龟虎,將訂單的明細(xì)映射到orderDetailBeans。
  • 在OrderDetail中添加items屬性ItemsBean itemsBean沙庐,將訂單明細(xì)所對應(yīng)的商品映射到itemsBean鲤妥。
四 多對多查詢-實現(xiàn)
1 配置映射
將用戶信息映射到user中

在Oders中添加訂單明細(xì)列表

在OrderDetail中添加items屬性
2 OrdersMapperCustom
<?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="dao.OrdersMapperCustom">

    <!--查詢用戶及用戶購買商品信息-->
    <resultMap id="UserAndItemsResultMap" type="entity.UserBean">
        <!--用戶信息-->
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="sex" property="sex"></result>
        <result column="address" property="address"></result>
        <!--訂單信息-->
        <collection property="ordersBeans" ofType="entity.OrdersBean">
            <id column="id" property="id"></id>
            <result column="user_id" property="user_id"></result>
            <result column="number" property="number"></result>
            <result column="createtime" property="createtime"></result>
            <result column="note" property="note"></result>
            <!--訂單明細(xì)-->
            <collection property="orderdetailBeans" ofType="entity.OrderdetailBean">
                <id column="orderdetail_id" property="id"></id>
                <result column="items_id" property="orders_id"></result>
                <result column="items_id" property="items_id"></result>
                <result column="orders_id" property="orders_id"></result>
                <!--商品信息-->
                <association property="itemsBean" javaType="entity.ItemsBean">
                <id column="items_id" property="id"></id>
                    <result column="items_name" property="name"></result>
                    <result column="items_detail" property="detail"></result>
                    <result column="items_price" property="price"></result>
                </association>
            </collection>
        </collection>
    </resultMap>
 
    <!--查詢用戶及用戶購買商品信息-->
    <select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">
  SELECT
 orders.*,
 user.username,
 user.sex,
 user.address,
 orderdetail.id orderdetail_id,
 orderdetail.items_id,
 orderdetail.item_num,
 orderdetail.orders_id,
 items.name items_name,
 items.detail items_detail,
 items.price items_price
FROM
 orders,
USER,
 orderdetail,
 items
WHERE
 orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id
    </select>
</mapper>
3 接口
    public List<UserBean> findUserAndItemsResultMap() throws Exception;
4 測試
    @Test
    public void findUserAndItemsResultMap() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
        List<UserBean> userBeans  = ordersMapperCustom.findUserAndItemsResultMap();
        System.out.println(userBeans);
    }
執(zhí)行結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拱雏,隨后出現(xiàn)的幾起案子棉安,更是在濱河造成了極大的恐慌,老刑警劉巖铸抑,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贡耽,死亡現(xiàn)場離奇詭異,居然都是意外死亡鹊汛,警方通過查閱死者的電腦和手機(jī)蒲赂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刁憋,“玉大人滥嘴,你說我怎么就攤上這事≈脸埽” “怎么了若皱?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵镊叁,是天一觀的道長。 經(jīng)常有香客問我走触,道長晦譬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任饺汹,我火速辦了婚禮蛔添,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兜辞。我一直安慰自己迎瞧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布逸吵。 她就那樣靜靜地躺著岩瘦,像睡著了一般喊衫。 火紅的嫁衣襯著肌膚如雪贾虽。 梳的紋絲不亂的頭發(fā)上摩泪,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音韩脑,去河邊找鬼氢妈。 笑死,一個胖子當(dāng)著我的面吹牛段多,可吹牛的內(nèi)容都是我干的首量。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼进苍,長吁一口氣:“原來是場噩夢啊……” “哼加缘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起觉啊,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拣宏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杠人,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勋乾,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年搜吧,在試婚紗的時候發(fā)現(xiàn)自己被綠了市俊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡滤奈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撩满,到底是詐尸還是另有隱情蜒程,我是刑警寧澤绅你,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站昭躺,受9級特大地震影響忌锯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜领炫,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一偶垮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帝洪,春花似錦似舵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至砰奕,卻和暖如春蛛芥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背军援。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工仅淑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胸哥。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓涯竟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親烘嘱。 傳聞我的和親對象是個殘疾皇子昆禽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容