码上敲享录 > Mybatis面试题 > Mybatis中如何进行多表查询?如何处理一对多和多对多的关系?

Mybatis中如何进行多表查询?如何处理一对多和多对多的关系?

上一章章节目录下一章 2023-07-16已有145人阅读 评论(0)

在 MyBatis 中进行多表查询可以使用 SQL 的关联查询语句来实现。同时,针对一对多和多对多的关系,MyBatis 提供了 ResultMap 的配置来处理结果集的映射。


以下是示例代码,演示了如何进行多表查询和处理一对多和多对多的关系:


1. 一对多关系:


假设有两个表:`users`(用户表)和 `orders`(订单表),一个用户可以拥有多个订单。


```xml

<!-- UserMapper.xml -->

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

   <resultMap id="userWithOrdersResultMap" type="com.example.User">

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

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

       <!-- 一对多关系 -->

       <collection property="orders" ofType="com.example.Order">

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

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

           <!-- 其他订单属性 -->

       </collection>

   </resultMap>


   <select id="getUserWithOrders" resultMap="userWithOrdersResultMap">

       SELECT u.id AS user_id, u.name AS user_name,

              o.id AS order_id, o.amount AS order_amount

       FROM users u LEFT JOIN orders o ON u.id = o.user_id

       WHERE u.id = #{id}

   </select>

</mapper>

```


上述示例中,我们通过 SQL 语句 `SELECT u.id AS user_id, u.name AS user_name, ...` 进行多表关联查询,并使用 `<collection>` 标签配置 `orders` 字段的映射关系,建立了一对多关系。


2. 多对多关系:


假设有两个表:`users`(用户表)和 `roles`(角色表),一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。


```xml

<!-- UserMapper.xml -->

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

   <resultMap id="userWithRolesResultMap" type="com.example.User">

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

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

       <!-- 多对多关系 -->

       <collection property="roles" ofType="com.example.Role">

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

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

           <!-- 其他角色属性 -->

       </collection>

   </resultMap>


   <select id="getUserWithRoles" resultMap="userWithRolesResultMap">

       SELECT u.id AS user_id, u.name AS user_name,

              r.id AS role_id, r.name AS role_name

       FROM users u

       LEFT JOIN user_role ur ON u.id = ur.user_id

       LEFT JOIN roles r ON r.id = ur.role_id

       WHERE u.id = #{id}

   </select>

</mapper>

```


上述示例中,我们通过 SQL 语句 `SELECT u.id AS user_id, u.name AS user_name, ...` 进行多表关联查询,并使用 `<collection>` 标签配置 `roles` 字段的映射关系,建立了多对多关系。


在使用 ResultMap 进行一对多和多对多关系的映射时,可以根据实际情况配置更多的属性,例如使用嵌套查询、关联查询等方式,来满足不同的查询需求。


通过合理配置 ResultMap,可以方便地处理多表查询和一对多、多对多关系的结果映射,简化了数据操作的编写和维护工作。


向大家推荐《Activiti工作流实战教程》:https://xiaozhuanlan.com/activiti
0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交