Mybatis學習記錄(六)----Mybatis的高級映射


1、一對多查詢

1.1 需求

查詢訂單及訂單明細的信息。

1.2 sql語句

確定主查詢表:訂單表

確定關聯查詢表:訂單明細表

在一對一查詢基礎上添加訂單明細表關聯即可。

SELECT 

orders.*,

USER.username,

USER.sex,

USER.address,

orderdetail.id orderdetail_id,

orderdetail.items_id,

orderdetail.items_num,

orderdetail.orders_id

FROM

orders,

USER,

orderdetail

WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id

1.3 分析

使用resultType將上邊的 查詢結果映射到pojo中,訂單信息的就是重復。

clip_image001

要求:

對orders映射不能出現重復記錄。

在orders.java類中添加List<orderDetail> orderDetails屬性。

最終會將訂單信息映射到orders中,訂單所對應的訂單明細映射到orders中的orderDetails屬性中。

每個orders中的orderDetails屬性存儲了該 訂單所對應的訂單明細。

1.4 在orders中添加list訂單明細屬性

clip_image003

1.5 修改mapper.xml

clip_image004

1.6 resultMap定義

<!-- 查詢訂單,關聯用戶信息以及訂單明細的resultMap -->
    <!-- extends:繼承,不用再配置訂單信息及用戶信息 -->
    <resultMap type="com.joe.mybatis.entities.Orders" id="OrderAndOrderDetailResultMap"
        extends="OrderCustomResultMap">
        <!-- 配置映射的訂單信息 -->
        <!-- 配置映射關聯的用戶信息 -->
        <!-- 訂單明細信息 -->
        <!-- 一個訂單關聯查詢出了多條訂單明細,用使用collection進行映射 
            collection:對關聯查詢到的多條記錄映射到集合對象中 
            property:將關聯查詢得到的多條記錄映射到com.joe.mybatis.entities.Orders類中的哪個屬性上 
            ofType:指定映射到List集合的pojo的類型
         -->
        <collection property="orderDetails" ofType="com.joe.mybatis.entities.OrderDetail">
            <!-- id:訂單明細的唯一標識 -->
            <!--property: 要將訂單明細中的唯一標示映射到com.joe.mybatis.entities.OrderDetail類的哪個屬性 -->
            <id column="orderdetail_id" property="id" />
            <result column="items_id" property="itemsId" />
            <result column="items_num" property="itemsNum" />
            <result column="orders_id" property="ordersId" />
        </collection>
    </resultMap>

1.7 mapper.java

 

clip_image005

 

1.8 小結

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

使用resultType實現:

將訂單明細映射到orders中的orderdetails中,需要自己處理,使用雙重循環遍歷,去掉重復記錄,將訂單明細放在orderdetails中。

2、多對多查詢

2.1 需求

查詢用戶及用戶購買商品信息。

2.2 sql語句

查詢主表是:用戶表

關聯表:由於用戶和商品沒有直接關聯,通過訂單和訂單明細進行關聯,所以關聯表:

orders、orderdetail、items

SELECT 

orders.*,

USER.username,

USER.sex,

USER.address,

orderdetail.id orderdetail_id,

orderdetail.items_id,

orderdetail.items_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

clip_image006

2.3 映射思路

將用戶信息映射到user中。

在user類中添加訂單列表屬性List<Orders> orderslist,將用戶創建的訂單映射到orderslist

在Orders中添加訂單明細列表屬性List<OrderDetail>orderdetials,將訂單的明細映射到orderdetials

在OrderDetail中添加Items屬性,將訂單明細所對應的商品映射到Items

2.4 mapper.xml

clip_image007

2.5 resultMap定義

<!-- 查詢用戶及商品情況的resultMap -->

    <resultMap type="com.joe.mybatis.entities.User" id="UserAndItemsResultMap">

        <!-- 用戶的唯一標識 -->
        <!-- column:指定唯一標識用戶信息的數據列 property:映射到user的哪個屬性 -->
        <id column="user_id" property="id" />
        <result column="username" property="username" />
        <result column="sex" property="sex" />
        <result column="address" property="address" />
        
        <!-- 訂單信息 -->
        
        <collection property="ordersList" ofType="com.joe.mybatis.entities.Orders">
        
            <!-- 配置映射的訂單信息 -->
            <!-- id:指定查詢列中的唯一標示,在這里是指訂單中的唯一標示,如果有多列組成唯一標示,就需要配置多個id -->
            <!-- column:訂單信息表的唯一標識列 property:訂單信息的唯一標識列所映射到Orders類中的屬性名 -->
            <id column="id" property="id" />
    
            <result column="user_id" property="userId" />
            <result column="number" property="number" />
            <result column="createtime" property="createtime" />
            <result column="note" property="note" />
            
            <!-- 訂單明細:一個訂單含有一個或多個訂單明細 -->
            <!-- 一個訂單關聯查詢出了多條訂單明細,用使用collection進行映射 collection:對關聯查詢到的多條記錄映射到集合對象中 
            property:將關聯查詢得到的多條記錄映射到com.joe.mybatis.entities.Orders類中的哪個屬性上 ofType:指定映射到List集合的pojo的類型 -->
            <collection property="orderDetails" ofType="com.joe.mybatis.entities.OrderDetail">
                <!-- id:訂單明細的唯一標識 -->
                <!--property: 要將訂單明細中的唯一標示映射到com.joe.mybatis.entities.OrderDetail類的哪個屬性 -->
                <id column="orderdetail_id" property="id" />
                <result column="items_id" property="itemsId" />
                <result column="items_num" property="itemsNum" />
                <result column="orders_id" property="ordersId" />
                
                <!-- 商品信息,一個明細對應一個商品 -->
                
                <association property="items" javaType="com.joe.mybatis.entities.Items">
                    
                    <id column="items_id" property="id"/>
                    
                    <result column="items_name" property="name"/>
                    <result column="items_detail" property="detail"/>
                    <result column="items_price" property="price"/>
                    
                </association>
                
            </collection>
        
        </collection>

    </resultMap>

2.6 mapper.java

clip_image008

2.7 多對多查詢總結

將查詢用戶購買的商品信息明細清單,(用戶名、用戶地址、購買商品名稱、購買商品時間、購買商品數量)

針對上邊的需求就使用resultType將查詢到的記錄映射到一個擴展的pojo中,很簡單實現明細清單的功能。

一對多是多對多的特例,如下需求:

查詢用戶購買的商品信息,用戶和商品的關系是多對多關系。

需求1:

查詢字段:用戶賬號、用戶名稱、用戶性別、商品名稱、商品價格(最常見)

企業開發中常見明細列表,用戶購買商品明細列表,

使用resultType將上邊查詢列映射到pojo輸出。

需求2:

查詢字段:用戶賬號、用戶名稱、購買商品數量、商品明細(鼠標移上顯示明細)

使用resultMap將用戶購買的商品明細列表映射到user對象中。

總結:

使用resultMap是針對那些對查詢結果映射有特殊要求的功能,,比如特殊要求映射成list中包括 多個list。

3、resultMap總結

3.1 resultType:

作用:

將查詢結果按照sql列名pojo屬性名一致性映射到pojo中。

場合:

常見一些明細記錄的展示,比如用戶購買商品明細,將關聯查詢信息全部展示在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list(list中是pojo)即可。

3.2 resultMap:

使用association和collection完成一對一和一對多高級映射(對結果有特殊的映射要求)。

3.2.1 association:

作用:

將關聯查詢信息映射到一個pojo對象中。

場合:

為了方便查詢關聯信息可以使用association將關聯訂單信息映射為用戶對象的pojo屬性中,比如:查詢訂單及關聯用戶信息。

使用resultType無法將查詢結果映射到pojo對象的pojo屬性中,根據對結果集查詢遍歷的需要選擇使用resultType還是resultMap。

3.2.2 collection:

作用:

將關聯查詢信息映射到一個list集合中。

場合:

為了方便查詢遍歷關聯信息可以使用collection將關聯信息映射到list集合中,比如:查詢用戶權限范圍模塊及模塊下的菜單,可使用collection將模塊映射到模塊list中,將菜單列表映射到模塊對象的菜單list屬性中,這樣的作的目的也是方便對查詢結果集進行遍歷查詢。

如果使用resultType無法將查詢結果映射到list集合中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM