resultType与resultMap的使用

需求: resultType与resultMap的使用

一. ============================= 查询订单信息, 关联查询用户信息, 属于 一对一 ================

  主表: 订单表

  子表: 用户表

  对应关系: 订单表-->用户表: 一对一; 用户表-->订单表: 一对多;

1. resultType用于配置sql查询结果与pojo完全相对应的属性(即查询结果对应的列要包括在对应pojo中的属性中)

  使用resultType, 如果查询结果的列超出对应pojo的属性, 就要另外定义一个pojo, 用于扩展原来pojo的字段,

  比如: 要查询订单, 关联查询订单对应的用户信息.

  这是时候就需要定义一个订单的扩展类OrdersCustom:

    (1) 因为要映射订单信息, 所以此类要继承Orders类;

    (2) 因为还要映射订单之外的关联用户的信息, 所以要在此类中把用户的需要查询的属性添加进来;

  对应的xml文件和Mapper接口面对的都是OrdersCustom类, 而不再是Orders类或者Users类

  xml:

  <id />

  <result />

2. 而使用resultMap映射查询结果的时候, 不需要另外定义一个扩展类,

  直接在Orders类中添加User对象(即把查询到的用户信息都封装成User对象user之中)

  然后在xml中分别配置好订单信息和用户信息即可, 订单信息和resultType一样配置, 用户信息使用association来映射

<resultMap id="resultMap的名字" type="Orders类(主表对应的类)">

  <!-- 配置Order属性(略) -->

 

  <!-- 配置User属性 -->

  <association property="user" javaType="User类的全类名">

    <id column="User表的唯一标识" property="" />

    <result column="普通属性列" property="普通属性" />

  </association>

</resultMap>

 

二. =============== 需求: 查询订单信息, 关联查询订单明细信息 , 一对多 ==============

  主表: 订单表(Orders)

  关联表: 订单明细表(OrderDetail)

  关联关系: 订单表-->订单明细: 一对多; 订单明细-->订单表: 一对一

分析:

  由于要查询订单信息, 关联查询订单明细信息, 一张订单表对应多条订单明细信息, 所以要在

订单类Order类中添加订单明细类OrderDetail类属性, 而且是一对多, 所以使用List

  public class Order {

    // 订单信息

    private XXX xxx;

    ......

    

    // 订单明细信息

    private List<OrderDetail> orderDetails;

 

    // 对应的setter/getter方法

  }

 

xml文件:

  使用collection, 上面的association是对应单条记录(即一个订单对应单个用户), 而collection对应的是多条记录(即一个订单对应多条订单明细)

<resultMap id="" type="">

  --------如果xml中已经配置了订单信息和用户信息, 那么在这个resultMap中只需要使用extends继承过来即可----------

  <!-- 订单信息 -->

  <!-- 用户信息 -->

  -------------------------------------------------------------------------------------------------------------------

  <!-- 订单明细信息 -->

  <collection property="Order类中的订单明细属性orderDetails" ofType="订单明细类的全类名(即List中的POJO的类型)">

    <id column="订单明细表的唯一标识(如果没有就需要添加一个唯一标识)" property="对应属性 " />

    <result column="" property="" />

  </collection>

</resultMap>

 

三. ========== 多对多, 需求: 查询用户及用户购买的商品=====================================

分析: 由于用户表和商品表之间没有直接关系, 需要使用订单表和订单明细表进行连接, 所以

  主表: 用户表User

  关联表: 订单表Order, 订单明细表OrderDetail, 商品表Item

映射思路:

  1. 将用户信息映射到user中;

  2. 在User类中添加订单属性orders, private List<Orders> orderDetails;

  3. 在Order类中添加订单明细属性orderDetails, private List<OrderDetail> orderDetails;

  4. 在OrderDetail类中添加商品属性item, private Item item;

xml文件:

  <resultMap id="resultMap的名字" type="User的全类名">

     <!-- 用户信息 -->

     <id />

       <result />

     <!-- 订单信息 -->

     <collection>

      <id />

      <result />

      <!-- 订单明细信息 --> 

      <collection>

       <id />

       <result />

       <!-- 商品信息 -->

       <association property="" javaType="">

        <id />

        <result />

       </association>

      </collection>

    </collection>

  </resultMap>

 

总结:

  (1) 使用resultType比使用resultMap简单, 使用场景: 打印订单明细(未来要纸张打印)

  (2) resultType不能实现延迟加载, resultMap可以使用延迟加载

  (3) 对查询结果又特殊要求就使用resultMap, 比如要求一定要包装到User对象中, 或者一定要延迟加载等等情况

    使用场景: 树型菜单, 鼠标点击之后触发js事件然后展示二级菜单明细

  (4) 使用resultMap会比较方便的获取到用户信息, 如通过getUser()即可

  (5) 使用resultType要自己手动循环遍历取值, 使用resultMap不需要手动遍历

 

------------------------------------------------------

 多对多:

 -----------------------------------------------------

 

posted @ 2017-02-25 15:58  半生戎马,共话桑麻、  阅读(193)  评论(0)    收藏  举报
levels of contents