zoukankan      html  css  js  c++  java
  • Mybatis学习记录(六)----Mybatis的高级映射

    1、一对多查询

    1.1 需求

    查询订单及订单明细的信息。

    1.2 sql语句

    确定主查询表:订单表

    确定关联查询表:订单明细表

    在一对一查询基础上添加订单明细表关联即可。

    SELECT 
    
    orders.*,
    
    USER.username,
    
    USER.sex,
    
    USER.address,
    
    orderdetail.id orderdetail_id,
    
    orderdetail.items_id,
    
    orderdetail.items_num,
    
    orderdetail.orders_id
    
    FROM
    
    orders,
    
    USER,
    
    orderdetail
    
    WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id

    1.3 分析

    使用resultType将上边的 查询结果映射到pojo中,订单信息的就是重复。

    clip_image001

    要求:

    对orders映射不能出现重复记录。

    在orders.java类中添加List<orderDetail> orderDetails属性。

    最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。

    每个orders中的orderDetails属性存储了该 订单所对应的订单明细。

    1.4 在orders中添加list订单明细属性

    clip_image003

    1.5 修改mapper.xml

    clip_image004

    1.6 resultMap定义

    <!-- 查询订单,关联用户信息以及订单明细的resultMap -->
        <!-- extends:继承,不用再配置订单信息及用户信息 -->
        <resultMap type="com.joe.mybatis.entities.Orders" id="OrderAndOrderDetailResultMap"
            extends="OrderCustomResultMap">
            <!-- 配置映射的订单信息 -->
            <!-- 配置映射关联的用户信息 -->
            <!-- 订单明细信息 -->
            <!-- 一个订单关联查询出了多条订单明细,用使用collection进行映射 
                collection:对关联查询到的多条记录映射到集合对象中 
                property:将关联查询得到的多条记录映射到com.joe.mybatis.entities.Orders类中的哪个属性上 
                ofType:指定映射到List集合的pojo的类型
             -->
            <collection property="orderDetails" ofType="com.joe.mybatis.entities.OrderDetail">
                <!-- id:订单明细的唯一标识 -->
                <!--property: 要将订单明细中的唯一标示映射到com.joe.mybatis.entities.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" />
            </collection>
        </resultMap>

    1.7 mapper.java

    clip_image005

     

    1.8 小结

    mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。

    使用resultType实现:

    将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。

    2、多对多查询

    2.1 需求

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

    2.2 sql语句

    查询主表是:用户表

    关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表:

    orders、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

    clip_image006

    2.3 映射思路

    将用户信息映射到user中。

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

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

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

    2.4 mapper.xml

    clip_image007

    2.5 resultMap定义

    <!-- 查询用户及商品情况的resultMap -->
    
        <resultMap type="com.joe.mybatis.entities.User" id="UserAndItemsResultMap">
    
            <!-- 用户的唯一标识 -->
            <!-- column:指定唯一标识用户信息的数据列 property:映射到user的哪个属性 -->
            <id column="user_id" property="id" />
            <result column="username" property="username" />
            <result column="sex" property="sex" />
            <result column="address" property="address" />
            
            <!-- 订单信息 -->
            
            <collection property="ordersList" ofType="com.joe.mybatis.entities.Orders">
            
                <!-- 配置映射的订单信息 -->
                <!-- id:指定查询列中的唯一标示,在这里是指订单中的唯一标示,如果有多列组成唯一标示,就需要配置多个id -->
                <!-- column:订单信息表的唯一标识列 property:订单信息的唯一标识列所映射到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进行映射 collection:对关联查询到的多条记录映射到集合对象中 
                property:将关联查询得到的多条记录映射到com.joe.mybatis.entities.Orders类中的哪个属性上 ofType:指定映射到List集合的pojo的类型 -->
                <collection property="orderDetails" ofType="com.joe.mybatis.entities.OrderDetail">
                    <!-- id:订单明细的唯一标识 -->
                    <!--property: 要将订单明细中的唯一标示映射到com.joe.mybatis.entities.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="com.joe.mybatis.entities.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>

    2.6 mapper.java

    clip_image008

    2.7 多对多查询总结

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

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

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

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

    需求1:

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

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

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

    需求2:

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

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

    总结:

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

    3、resultMap总结

    3.1 resultType:

    作用:

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

    场合:

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

    3.2 resultMap:

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

    3.2.1 association:

    作用:

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

    场合:

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

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

    3.2.2 collection:

    作用:

    将关联查询信息映射到一个list集合中。

    场合:

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

    如果使用resultType无法将查询结果映射到list集合中。

  • 相关阅读:
    Candy leetcode java
    Trapping Rain Water leetcode java
    Best Time to Buy and Sell Stock III leetcode java
    Best Time to Buy and Sell Stock II leetcode java
    Best Time to Buy and Sell Stock leetcode java
    Maximum Subarray leetcode java
    Word Break II leetcode java
    Word Break leetcode java
    Anagrams leetcode java
    Clone Graph leetcode java(DFS and BFS 基础)
  • 原文地址:https://www.cnblogs.com/doctorJoe/p/5291023.html
Copyright © 2011-2022 走看看