mybatis进行多表关联查询时,如何接收多表结果?

在 MyBatis 中进行多表关联查询时,通常可以通过两种方式来接收多表查询结果:使用嵌套结果映射(Nested Result Mapping)或者使用关联查询(Association Query)。这取决于你的查询需求和数据结构。

以下是Association示例说明:

1. Association1对1嵌套结果映射(Nested Result Mapping):

假设你有两个实体类:`Order` 和 `User`,并且你希望查询订单信息以及每个订单对应的用户信息。

<!-- OrderMapper.xml -->
<select id="getOrdersWithUsers" resultType="Order">
    SELECT o.*, u.id as user_id, u.username as user_username
    FROM orders o
    INNER JOIN users u ON o.user_id = u.id
</select>

在这个例子中,你将使用一个查询来获取包含订单信息以及嵌套用户信息的结果。在`resultType`中指定主实体类型(这里是`Order`),然后在查询中使用别名来映射嵌套的用户信息。

// Order.java
public class Order {
    private int id;
    private User user;
    // other fields, getters and setters
}

// User.java
public class User {
    private int id;
    private String username;
    // other fields, getters and setters
}

### 2. 关联查询(Association Query):

在这种方式中,你可以使用 MyBatis 的关联查询功能,通过在查询语句中嵌套使用`<association>`标签来映射关联的实体。

<!-- OrderMapper.xml -->
<select id="getOrdersWithUsers" resultMap="OrderWithUserResultMap">
    SELECT o.*, u.*
    FROM orders o
    INNER JOIN users u ON o.user_id = u.id
</select>

<resultMap id="OrderWithUserResultMap" type="Order">
    <id property="id" column="id" />
    <!-- other fields -->
    <association property="user" resultMap="UserResultMap" />
</resultMap>

<resultMap id="UserResultMap" type="User">
    <id property="id" column="user_id" />
    <result property="username" column="user_username" />
    <!-- other fields -->
</resultMap>

在这个例子中,你定义了两个`resultMap`,一个用于订单信息,另一个用于用户信息,然后通过`<association>`标签将两者关联起来。使用 `<association>` 子标签,可以处理复杂的多表关联查询,并将关联的实体嵌套映射主实体中。这些子标签使你能够在查询结果映射中处理对象的关联关系,从而获得更加结构化的数据结果。

2. Association1对多嵌套结果映射(Nested Result Mapping不常用一般用collection):

在MyBatis中,你可以使用`<association>` 元素来配置实体之间的关联关系,表示对象间的关联。以下是一个使用`<association>` 元素定义一对多关联关系的示例:

假设我们有两个实体类:`User` 和 `Order`,其中一个用户可以拥有多个订单。

public class User {
    private int id;
    private String name;
    private List<Order> orders;
    // 省略 getter 和 setter 方法
}

public class Order {
    private int id;
    private String product;
    private int userId; // 关联到User的id
    // 省略 getter 和 setter 方法
}

然后,在MyBatis的XML映射文件(例如`UserMapper.xml`)中使用`<association>` 元素配置关联关系:

<mapper namespace="com.example.UserMapper">

    <resultMap id="userResultMap" type="User">
        <id property="id" column="user_id"/>
        <result property="name" column="user_name"/>
        <!-- 使用 <association> 元素定义一对多的关联关系 -->
        <association property="orders" javaType="java.util.List" resultMap="orderResultMap"/>
    </resultMap>

    <resultMap id="orderResultMap" type="Order">
        <id property="id" column="order_id"/>
        <result property="product" column="order_product"/>
        <result property="userId" column="user_id"/>
    </resultMap>

    <!-- 查询用户及其关联的订单 -->
    <select id="getUserWithOrders" resultMap="userResultMap">
        SELECT u.id as user_id, u.name as user_name,
               o.id as order_id, o.product as order_product, o.user_id
        FROM users u
        LEFT JOIN orders o ON u.id = o.user_id
        WHERE u.id = #{userId}
    </select>

</mapper>

在上面的示例中,`<association>` 元素被用于定义一对多的关联关系。`property` 属性指定了关联关系在`User`实体中的属性名称(这里是`orders`),`javaType` 属性指定了关联实体的类型(这里是`java.util.List`),`resultMap` 属性指定了关联实体的映射规则(这里是`orderResultMap`)。

这样配置后,在查询用户信息时,MyBatis会自动将用户的订单查询出来,并封装到`User`对象的`orders`属性中。

请注意,实际的配置可能会根据你的数据表结构和需求有所不同。以上示例提供了一个基本的指导,帮助你理解如何在MyBatis中使用`<association>` 元素配置一对多的关联关系。

以下是Collection一对多示例说明:

当您需要在 MyBatis 中处理一对多关系(一个对象关联多个对象)时,您可以使用 `<collection>` 元素来映射关联表的多个行记录到一个 Java 集合属性中。这通常在数据库模式中具有一对多关系的情况下很有用。

以下是一个使用 `<collection>` 元素的示例:

```xml

<resultMap id="DepartmentWithEmployeesResultMap" type="Department">
    <id property="id" column="dept_id"/>
    <result property="name" column="dept_name"/>
    <collection property="employees" ofType="Employee" resultMap="EmployeeResultMap"/>
</resultMap>

<resultMap id="EmployeeResultMap" type="Employee">
    <id property="id" column="emp_id"/>
    <result property="name" column="emp_name"/>
    <!-- Other employee properties -->
</resultMap>

或写成这样:

<resultMap id="DepartmentWithEmployeesResultMap" type="Department">
    <id property="id" column="dept_id"/>
    <result property="name" column="dept_name"/>
    <collection property="employees" ofType="Employee" javaType="java.util.ArrayList">
        <id property="id" column="emp_id"/>
        <result property="name" column="emp_name"/>
        <!-- Other employee properties -->
    </collection>
</resultMap>

在这个示例中,`Department` 类包含一个名为 `employees` 的集合属性,它被映射到关联的 `Employee` 对象。通过使用 `<collection>` 元素,您可以映射从关联表检索到的多个行记录到一个集合中。

在您的 Java 类中,`Department` 类会有一个 `List<Employee>` 类型的属性,可以容纳多个 `Employee` 对象

需要注意的是,使用 `<collection>` 元素时,通常需要在查询中使用 JOIN 或其他方式将关联表的数据连接起来,以便 MyBatis 可以将数据正确地映射到集合属性中。

总之,使用 `<collection>` 元素允许您在 MyBatis 中处理一对多关系,使您能够将关联表的多个行记录映射到一个集合属性中,从而更好地表示复杂的数据关系。

这两种方式都可以用来在 MyBatis 中接收多表关联查询的结果。你可以根据数据结构查询需求来选择合适的方式。无论哪种方式,你都可以得到包含多表关联信息的实体对象或者嵌套的属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值