Mybatis——一对多关联映射

一对多关联映射

一对多关联映射有两种方式,都用到了collection元素

以购物网站中用户和订单之间的一对多关系为例

collection集合的嵌套结果映射

创建两个实体类和映射接口

package org.example.demo;

import lombok.Data;

import java.util.List;

@Data
public class User {
    private Integer userId;
    private String userName;
    private String password;
    private Cart cart;
    private List<Order> orderList;
}
package org.example.demo;

import lombok.Data;

@Data
public class Order {
    private Integer orderId;
    private double price;
}

实现根据用户id查询出所有用户信息,包括该用户的所有订单信息 

package org.example.mapper;

import org.example.demo.User;

import java.util.List;

public interface UserMapper {

    User findUserAndOrderListByUserId(Integer userId);
}
方式一:与association类似,集合的嵌套结果映射就是指通过一次SQL查询得到所有的结果 
<resultMap type="com.mybatis.entity.User" 
        id="userMap">
        <id property="id" column="id"/>
    <result property="userName" column="user_name"/>
    <result property="password" column="password"/>
</resultMap>
<resultMap type="com.mybatis.entity.User" 
    id="userAndOrderListMap" extends="userMap">
    <collection property="orderList" 
        ofType="com.mybatis.entity.Order">
        <id property="id" column="order_id"/>
        <result property="price" column="price"/>
    </collection>
</resultMap>
<select id="findUserAndOrderListById" 
    resultMap="userAndOrderListMap">
    select u.id, u.user_name, u.password,
    o.order_id, o.price
    from user u
    left join orders o on u.id = o.user_id
    where u.id = #{id}
</select>

resultMap元素中的extends属性可以实现结果映射的继承

collection的ofType属性指定集合中元素的类型,必选项 

    <resultMap id="userAndOrderMap" type="org.example.demo.User">
        <id property="userId" column="user_id"/>
        <result property="userName" column="user_name"/>
        <result property="password" column="password"/>
        <collection property="orderList" ofType="org.example.demo.Order">
            <id property="orderId" column="order_id"/>
            <result property="price" column="price"/>
        </collection>
    </resultMap>
    <select id="findUserAndOrderListByUserId" resultMap="userAndOrderMap">
        select
            *
        from t_user u
        left join t_order o on u.user_id = o.user_id
        where u.user_id = #{userId};
    </select>

 

collection集合的嵌套查询

集合的嵌套查询同样会执行额外的SQL查询

<resultMap type="com.mybatis.entity.User"
    id="userAndOrderListMap" extends="userMap">
    <collection property="orderList" column="{uid=id}"
        ofType="com.mybatis.entity.Order"       select="com.mybatis.mapper.OrderMapper.findOrdersByUserId">
    </collection>
</resultMap>
<select id="findUserAndOrderListById" 
    resultMap="userAndOrderListMap">
    select * from user where id = #{id}
</select>

OrderMapper.xml

<resultMap type="com.mybatis.entity.Order"
    id="orderMap">
    <id property="id" column="order_id"/>
    <result property="price" column="price"/>
</resultMap>
<select id="findOrdersByUserId"
    resultMap="orderMap">
    select * from orders where user_id = #{uid}
</select>

对比两种方式

第一种方式属于“关联的嵌套结果映射“,即通过一次SQL查询根据表或指定的属性映射到不同的对象中

第二种方式属于“关联的嵌套查询”,利用简单的SQL语句,通过多次查询得到想要的结果,也可以实现延迟加载效果 

 

 

相关推荐

  1. MyBatis 自定义映射 ResultMap:映射关系处理

    2024-04-03 05:24:02       30 阅读
  2. Mybatis一对一,关联查询

    2024-04-03 05:24:02       31 阅读
  3. MyBatis笔记——映射问题解决

    2024-04-03 05:24:02       34 阅读
  4. Mybatis映射之一映射

    2024-04-03 05:24:02       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-03 05:24:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-03 05:24:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-03 05:24:02       82 阅读
  4. Python语言-面向对象

    2024-04-03 05:24:02       91 阅读

热门阅读

  1. 关于其他服务器篡改请求头导致登录失效

    2024-04-03 05:24:02       38 阅读
  2. 大语言模型开发各个阶段的评估方法(未完)

    2024-04-03 05:24:02       33 阅读
  3. 后管配置js

    2024-04-03 05:24:02       37 阅读
  4. 【Python】文件内容编码类型检测

    2024-04-03 05:24:02       33 阅读
  5. Android Drawable - Shape Drawable使用详解

    2024-04-03 05:24:02       36 阅读
  6. 定时推送任务 Apache HttpClient/okhttp3

    2024-04-03 05:24:02       30 阅读
  7. P1002 过河卒:图论动态规划入门

    2024-04-03 05:24:02       37 阅读