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,是针对于对查询结果有特殊要求的功能而使用的。

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