zoukankan      html  css  js  c++  java
  • Mybatis 关联查询(三)

    多对多的管理查询结果映射

      1. 需求:
    查询用户购买的商品信息
      2. 分析:
    (1)用户和商品没有直接关联
    (2)用户和订单进行了关联,订单和订单明细进行了关联,订单明细和商品进行了关联,因此要使用四张表来完成联合查询
      3、映射方法:
    (1)将用户信息映射到user中。
    (2)在user类中添加订单列表属性List orderslist,将用户创建的订单映射到orderslist
    (3)在Orders中添加订单明细列表属性Listorderdetials,将订单的明细映射到orderdetials
    (4)在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Items
      4、PO类:

    User的PO

    public class User implements Serializable {
    	private int id;
    	private String username;// 用户姓名
    	private String sex;// 性别
    	private Date birthday;// 生日
    	private String address;// 地址
    	private List<Orders> orders;
    	public List<Orders> getOrders() {
    		return orders;
    	}
    
    	public void setOrders(List<Orders> orders) {
    		this.orders = orders;
    	}
    ......
    }
    

    Orders的PO

    public class Orders {
        private Integer id;
    
        private Integer userId;
    
        private String number;
    
        private Date createtime;
    
        private String note;
        //订单明细
        private List<Orderdetail> orderdetails;
        public List<Orderdetail> getOrderdetails() {
            return orderdetails;
        }
    
        public void setOrderdetails(List<Orderdetail> orderdetails) {
            this.orderdetails = orderdetails;
        }
    ......
    }
    

    Orderdetail的PO

    public class Orderdetail {
        private Integer id;
    
        private Integer ordersId;
    
        private Integer itemsId;
    
        private Integer itemsNum;
        //Items
        private Items items;
        public Items getItems() {
            return items;
        }
    
        public void setItems(Items items) {
            this.items = items;
        }
    ......
    }
    

    Items的 PO

    public class Items {
        private Integer id;
    
        private String name;
    
        private Float price;
    
        private String pic;
    
        private Date createtime;
    
        private String detail;
    ......
    }
    

      5、resultMap:

     <!--
            多对多查询:查询用户及用户购买商品信息。
        -->
        <resultMap id="UserAndItemsResultMap" type="User">
            <!--用户信息-->
            <id column="user_id" property="id" />
            <result column="username" property="username" />
            <result column="sex" property="sex" />
            <result column="address" property="address" />
            <!--订单信息-->
            <collection property="orders" ofType="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 property="orderdetails" ofType="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="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>
    

      6、mapper.XML:

     <select id="findUserAndItems" 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>
    

      7、mapper接口:

     public List<User> findUserAndItems() throws Exception;
    

      8、测试代码:

     public void testFindUserAndItems() throws Exception{
            SqlSession session = sessionFactory.openSession();
            Mapper mapper = session.getMapper(Mapper.class);
            List<User> users = mapper.findUserAndItems();
            for (User user : users){
                System.out.println(user);
            }
        }
    

    二、多对多查询总结

    (1)将查询用户购买的商品信息明细清单,(用户名、用户地址、购买商品名称、购买商品时间、购买商品数量)

    针对上边的需求就使用resultType将查询到的记录映射到一个扩展的pojo中,很简单实现明细清单的功能。

    (2)一对多是多对多的特例,如下需求:
    查询用户购买的商品信息,用户和商品的关系是多对多关系。
    需求1:
    查询字段:用户账号、用户名称、用户性别、商品名称、商品价格(最常见)
    企业开发中常见明细列表,用户购买商品明细列表,
    使用resultType将上边查询列映射到pojo输出。

    需求2:
    查询字段:用户账号、用户名称、购买商品数量、商品明细(鼠标移上显示明细)
    使用resultMap将用户购买的商品明细列表映射到user对象中。

    (3)总结:

    使用resultMap是针对那些对查询结果映射有特殊要求的功能,,比如特殊要求映射成list中包括 多个list。

    三、resultMap的总结

    1. resultType:
      作用:
      将查询结果按照sql列名pojo属性名一致性映射到pojo中。
      场合:
      常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

    2. resultMap:
      使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。

    3. association:
      作用:
      将关联查询信息映射到一个pojo对象中。
      场合:
      为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。
      使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。

    4. collection:
      作用:
      将关联查询信息映射到一个list集合中。
      场合:
      为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。
      如果使用resultType无法将查询结果映射到list集合中。

  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/jack1995/p/7260719.html
Copyright © 2011-2022 走看看