mybatis學習之高級映射中的多對多查詢

多對多查詢

1、需求

查詢用戶及用戶所購買的商品信息

2、sql語句

需要查詢的主表是:用戶表User
需要查詢的關聯表:由於用戶和商品沒有直接關聯,通過訂單和訂單明細進行關聯,所以關聯變:訂單表order,訂單明細表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`


3、映射思路

將用戶信息映射到User類中
在User類中,添加訂單列表屬性List<Order> orderList,將用戶創建的訂單映射到orderList
在Order類中,添加訂單明細列表屬性List<OrderDetail> orderDetails,將訂單明細映射到orderDetails
在OrderDetail類中,添加Items屬性List<Items> itemsDetails,將所對應的商品映射到itemsDetails
User類:
    //屬性名和數據庫表的字段一一對應
    private Integer id;
    private String username;// 用戶姓名
    private String sex;// 性別
    private Date birthday;// 生日
    private String address;// 地址

    //用戶創建的訂單列表
    private List<Order> orderList;

Order類:
    private Integer id;
    private Integer userId;
    private String number;
    private Date  createtime;
    private String note;
    //用戶信息
    private User user;

    //訂單詳情List
    private List<OrderDetail> OrderDetails;

OrderDetail類:
    private Integer id;
    private Integer ordersId;
    private Integer itemsId;
    private Integer itemsNum;

    //商品信息
    private Items items;



4、mapper.xml


4.1resultMap

注意此處:嵌套式映射,根據業務關係,一級一級判斷,
    <!-- 查詢用戶 及 購買的商品 resultMap -->
    <resultMap id="UserAndItemsResultMap" type="pojo.User">
        <!-- 用戶信息 -->
        <id column="user_id" property="id" />
        <result column="username" property="username" />
        <result column="sex" property="sex" />
        <result column="address" property="address" />

        <!--
        訂單信息
        一個用戶對應多張訂單
         -->
        <collection property="orderList" ofType="pojo.Order" >
            <id column="id" property="id" />
            <result column="number" property="number" />
            <result column="createtime" property="createtime" />
            <result column="note" property="note"/>

            <!--
            訂單明細信息
            一個訂單對應多個明細
            -->
            <collection property="OrderDetails" ofType="pojo.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="pojo.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>


4.2 statement

    <!-- 查詢用戶 及 購買的商品信息 使用resultMap -->
    <select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">
        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`
    </select>


5、mapper.java

    //查詢用戶以及購買的商品信息
    public List<User> findUserAndItemsResultMap() throws  Exception;


6、測試代碼

    @Test
    public void testFindUserAndItemsResultMap() throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OrderMapperCustom orderMapperCustom = sqlSession.getMapper(OrderMapperCustom.class);
        List<User> list = orderMapperCustom.findUserAndItemsResultMap();
        System.out.println(list);
    }


7、輸出結果

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - Class not found: org.jboss.vfs.VFS
DEBUG [main] - JBoss 6 VFS API is not available in this environment.
DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile
DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Reader entry: Items.class
DEBUG [main] - Reader entry: Order.class
DEBUG [main] - Reader entry: OrderCustom.class
DEBUG [main] - Reader entry: OrderDetail.class
DEBUG [main] - Reader entry: User.class
DEBUG [main] - Reader entry: UserCustom.class
DEBUG [main] - Reader entry: UserQueryVo.class
DEBUG [main] - Listing file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Items.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Items.class
DEBUG [main] - Reader entry: ����   4 W
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Order.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Order.class
DEBUG [main] - Reader entry: ����   4 f
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderCustom.class
DEBUG [main] - Reader entry: ����   4 "
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderDetail.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderDetail.class
DEBUG [main] - Reader entry: ����   4 J
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/User.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/User.class
DEBUG [main] - Reader entry: ����   4 [
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserCustom.class
DEBUG [main] - Reader entry: ����   4 
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserQueryVo.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserQueryVo.class
DEBUG [main] - Reader entry: ����   4 %
DEBUG [main] - Checking to see if class pojo.Items matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.Order matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.OrderCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.OrderDetail matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.User matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.UserCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.UserQueryVo matches criteria [is assignable to Object]
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Reader entry: OrderMapperCustom.class
DEBUG [main] - Reader entry: OrderMapperCustom.xml
DEBUG [main] - Reader entry: UserMapper.class
DEBUG [main] - Reader entry: UserMapper.xml
DEBUG [main] - Listing file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.class
DEBUG [main] - Reader entry: ����   4    
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.xml
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.xml
DEBUG [main] - Reader entry: <?xml version="1.0" encoding="UTF-8" ?>
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.class
DEBUG [main] - Reader entry: ����   4    findUserByIdResultMap (I)Lpojo/User; 
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.xml
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.xml
DEBUG [main] - Reader entry: <?xml version="1.0" encoding="UTF-8" ?>
DEBUG [main] - Checking to see if class mapper.OrderMapperCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class mapper.UserMapper matches criteria [is assignable to Object]
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 2070529722.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7b69c6ba]
DEBUG [main] - ==>  Preparing: 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` 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 4
[User{id=28, username='fjnmbb124', sex='1', birthday=null, address='湖南長沙', orderList=[Order{id=6, userId=null, number='3', createtime=Thu Jun 22 21:30:02 CST 2017, note='null', user=null, OrderDetails=[OrderDetail{id=5, ordersId=6, itemsId=4, itemsNum=1, items=Items{id=4, name='a', price=123.0, detail='null', Pic='null', craetetime=null}}, OrderDetail{id=8, ordersId=6, itemsId=5, itemsNum=2017, items=Items{id=5, name='b', price=123123.0, detail='123123', Pic='null', craetetime=null}}]}]}, User{id=29, username='測試測試1', sex='1', birthday=null, address='湖南益陽', orderList=[Order{id=7, userId=null, number='6', createtime=Thu Jun 22 21:30:12 CST 2017, note='null', user=null, OrderDetails=[OrderDetail{id=9, ordersId=7, itemsId=4, itemsNum=2, items=Items{id=4, name='a', price=123.0, detail='null', Pic='null', craetetime=null}}, OrderDetail{id=7, ordersId=7, itemsId=5, itemsNum=2, items=Items{id=5, name='b', price=123123.0, detail='123123', Pic='null', craetetime=null}}]}]}]

Process finished with exit code 0

8、總結

將查詢用戶購買的商品的信息明細清單(用戶名,用戶地址,購買商品名稱,購買商品時間,購買商品數量)
針對上面的需求,使用resultType,將查詢到的記錄映射到一個擴展的pojo中,很簡單的實現該功能。
使用resultMap,是針對於對查詢結果有特殊要求的功能而使用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章