zoukankan      html  css  js  c++  java
  • 【Mybatis】---高级映射之多对多查询

    需求:

    查询用户及用户购买商品信息。

    sql语句

    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
    

    映射思路

    将用户信息映射到user中。

    在user类中添加订单列表属性List<Orders> orderslist,将用户创建的订单映射到orderslist

    在Orders中添加订单明细列表属性List<OrderDetail>orderdetials,将订单的明细映射到orderdetials

    在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Items

    mapper.xml

      <!-- 查询用户及购买的商品信息,使用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>

    resultMap定义

    <!-- 查询用户及购买的商品 -->
    	<resultMap type="cn.itcast.mybatis.po.User" id="UserAndItemsResultMap">
    		<!-- 用户信息 -->
    		<id column="user_id" property="id"/>
    		<result column="username" property="username"/>
    		<result column="sex" property="sex"/>
    		<result column="address" property="address"/>
    		
    		<!-- 订单信息
    		一个用户对应多个订单,使用collection映射
    		 -->
    		 <collection property="ordersList" ofType="cn.itcast.mybatis.po.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="cn.itcast.mybatis.po.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="cn.itcast.mybatis.po.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>

    mapper.java

        //查询用户购买商品信息
        public List<User> findUserAndItemsResultMap() throws Exception;
    

    多对多查询总结

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

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

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

    查询用户购买的商品信息,用户和商品的关系是多对多关系。

    需求1:

    查询字段:用户账号、用户名称、用户性别、商品名称、商品价格(最常见)

    企业开发中常见明细列表,用户购买商品明细列表,

    使用resultType将上边查询列映射到pojo输出。

    需求2:

    查询字段:用户账号、用户名称、购买商品数量、商品明细(鼠标移上显示明细)

    使用resultMap将用户购买的商品明细列表映射到user对象中。


    总结:

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

    resultType:

    作用:

             将查询结果按照sql列名pojo属性名一致性映射到pojo中。

    场合:

             常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

    resultMap:

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

    association:

    作用:

             将关联查询信息映射到一个pojo对象中。

    场合:

             为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。

             使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。


  • 相关阅读:
    dd是___元素
    【电商8】footer mod_service
    外边距塌陷问题
    隐藏display: ____;
    判断一个32位的整数的二进制有几个1
    8 switch case
    键盘录入
    两个整数的交换
    运算符
    java 异常报错总结
  • 原文地址:https://www.cnblogs.com/chenxiaochan/p/7253427.html
Copyright © 2011-2022 走看看