Mybatis一对一,一对多关联查询

一对一 <association>

<association> 元素用于处理一对一的关联关系。当查询结果中包含一个对象与另一个对象之间的关联,且这种关联是一对一时,可以使用 <association> 来映射这种关系。<association> 元素内部可以定义多个 <id><result> 或其他 <association><collection> 元素,以映射关联对象的属性。

一对多<collection>

<collection> 元素用于处理一对多的关联关系。当查询结果中包含一个对象与多个对象之间的关联,且这种关联是一对多时,可以使用 <collection> 来映射这种关系。<collection> 元素内部同样可以定义多个 <id><result> 或其他 <association><collection> 元素,以映射集合中每个元素的属性。

场景举例:

<association> 示例详解

场景描述

假设有一个用户(User)系统,每个用户都有一个与之关联的地址(Address)。在这个系统中,用户和地址之间是一对一的关系,即一个用户只有一个地址,而一个地址也只属于一个用户。

数据库表结构
  • 用户表(User)
    • user_id(用户ID,主键)
    • username(用户名)
    • ...(其他用户相关字段)
  • 地址表(Address)
    • address_id(地址ID,主键)
    • user_id(用户ID,外键,关联到用户表的user_id)
    • street(街道)
    • city(城市)
    • ...(其他地址相关字段)
ResultMap 配置

在MyBatis的Mapper XML文件中,我们可以使用<association>来映射用户和地址之间的一对一关系。


	<resultMap id="userWithAddressMap" type="User"> 

	<id property="id" column="user_id" /> 

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

	<!-- 使用<association>映射地址信息 --> 

	<association property="address" javaType="Address"> 

	<id property="id" column="address_id" /> 

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

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

	</association> 

	</resultMap>
  • property="address":指定User对象中的哪个属性用于存放Address对象。
  • javaType="Address":指定关联对象的类型,这里是Address。
  • <association>内部,通过<id><result>标签映射Address对象的各个属性。
SQL 查询
<select id="selectUserWithAddress" resultMap="userWithAddressMap"> 
SELECT u.user_id, u.username, a.address_id, a.street, a.city 
FROM User u 
LEFT JOIN Address a ON u.user_id = a.user_id 
WHERE u.user_id = #{userId} 
</select>

这个查询通过左连接(LEFT JOIN)将用户表和地址表连接起来,并通过resultMap属性指定了结果映射规则。

<collection> 示例详解

场景描述

继续上面的用户系统,这次我们考虑用户和订单(Order)之间的关系。每个用户可以有多个订单,即用户和订单之间是一对多的关系。

数据库表结构
  • 订单表(Order)
    • order_id(订单ID,主键)
    • user_id(用户ID,外键,关联到用户表的user_id)
    • order_number(订单号)
    • order_date(订单日期)
    • ...(其他订单相关字段)
ResultMap 配置

在MyBatis的Mapper XML文件中,我们可以使用<collection>来映射用户和订单之间的一对多关系。

<resultMap id="userWithOrdersMap" type="User"> 
<id property="id" column="user_id" /> 
<result property="username" column="username" /> 
<!-- 使用<collection>映射订单集合 --> 
<collection property="orders" ofType="Order"> 
<id property="id" column="order_id" /> 
<result property="orderNumber" column="order_number" /> 
<result property="orderDate" column="order_date" /> 
</collection> 
</resultMap>
  • property="orders":指定User对象中的哪个属性用于存放Order对象的集合。
  • ofType="Order":指定集合中元素的类型,这里是Order。注意,这里使用的是ofType而不是javaType,因为javaType用于指定整个集合的类型(通常是List、Set等),而ofType用于指定集合中元素的类型。
  • <collection>内部,同样通过<id><result>标签映射Order对象的各个属性。
SQL 查询
<select id="selectUserWithOrders" resultMap="userWithOrdersMap"> 
SELECT u.user_id, u.username, o.order_id, o.order_number, o.order_date 
FROM User u 
LEFT JOIN Order o ON u.user_id = o.user_id

相关推荐

  1. Mybatis一对一关联查询

    2024-07-14 23:18:04       25 阅读
  2. MyBatis——实现级联表查询一对一

    2024-07-14 23:18:04       36 阅读
  3. mybatis一对一,字段重复

    2024-07-14 23:18:04       27 阅读
  4. [Django-04]一对一

    2024-07-14 23:18:04       61 阅读

最近更新

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

    2024-07-14 23:18:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 23:18:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 23:18:04       57 阅读
  4. Python语言-面向对象

    2024-07-14 23:18:04       68 阅读

热门阅读

  1. R语言简单介绍及零基础学习路径

    2024-07-14 23:18:04       19 阅读
  2. 在unity中的球形插值方法中第三个参数t是什么

    2024-07-14 23:18:04       18 阅读
  3. linux安装pure-ftpd-1.0.51

    2024-07-14 23:18:04       17 阅读
  4. Linux 编程中的 open() 与 fdopen() 区别与联系

    2024-07-14 23:18:04       19 阅读
  5. iPython 使用技巧

    2024-07-14 23:18:04       16 阅读
  6. C基础入门题:石头剪刀布

    2024-07-14 23:18:04       21 阅读
  7. Linux C++编程-实现进程的冻结与恢复管理模块

    2024-07-14 23:18:04       17 阅读