MyBatis 可以通过定义多个表的关联关系,实现多表查询。下面介绍两种常用的多表关联查询方法。
1. 嵌套查询
第一种方法是通过嵌套查询来实现多表关联查询。具体步骤如下:
//1.在 Mapper 接口中定义查询方法,方法返回值为一个包含多个实体对象的父实体对象。例如:
User selectUserWithOrders(Integer userId);
//2.在 Mapper XML 文件中编写 SQL 语句,使用嵌套查询来引用另一个表的数据。例如:
<select id="selectUserWithOrders" resultMap="userWithOrdersResultMap">
select * from user where id = #{userId}
</select>
<resultMap id="userWithOrdersResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- 其他属性 -->
<collection property="orders" ofType="Order">
<id property="id" column="order_id"/>
<result property="name" column="order_name"/>
<!-- 其他属性 -->
</collection>
</resultMap>
//在上面的代码中,<collection> 标签定义了一个集合属性,它的 property 属性指定了要映射的集合属性名称,
ofType 属性指定了集合中元素的类型。在 <collection> 标签内部,可以再定义多个子标签来指定集合元素的字段映射。
//3.在调用查询方法时,传入用户 ID,即可查询到该用户及其所有订单的信息。例如:
User user = userMapper.selectUserWithOrders(1);
2. 多表关联查询
//1.在 Mapper 接口中定义查询方法,方法返回值为一个包含多个实体对象的父实体对象。例如:
List<User> selectUsersAndOrders();
//2.在 Mapper XML 文件中编写 SQL 语句,使用 JOIN 语句来实现多表关联查询。例如:
<select id="selectUsersAndOrders" resultMap="userWithOrdersResultMap">
select u.*, o.*
from user u
left join orders o on u.id = o.user_id
</select>
<resultMap id="userWithOrdersResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- 其他属性 -->
<collection property="orders" ofType="Order">
<id property="id" column="order_id"/>
<result property="name" column="order_name"/>
<!-- 其他属性 -->
</collection>
</resultMap>
//在上面的代码中,使用 LEFT JOIN 关键字将两个表连接起来,并使用 u.* 和 o.* 来选择需要查询的字段。在 <resultMap> 中同样定义了用户和订单的映射关系。
//3.在调用查询方法时,即可查询到所有用户及其所有订单的信息。例如:
List<User> users = userMapper.selectUsersAndOrders();
网友评论