mybatis查询子表
时间: 2023-08-27 10:20:24 浏览: 106
在Mybatis中进行查询子表可以使用两种方式:子查询和联表查询。子查询是指在SQL语句中嵌套查询,需要进行多次查询操作。例如,如果一个老师对应多个学生,可以先查询出所有的学生信息,然后再根据学生所关联的老师ID查询对应的老师信息。这种方式需要使用collection和association标签来处理对象属性的映射。具体的配置可以参考相关的文档和实例。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [Mybatis多表查询之一对多、多对一](https://blog.csdn.net/qq_53860947/article/details/123743724)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
相关问题
mybatis子表查询
Mybatis可以通过嵌套查询实现子表查询。具体实现方式是在mapper.xml文件中使用select标签进行嵌套查询,例如:
```
<select id="findOrderWithItems" resultMap="orderWithItems">
select * from orders where order_id = #{orderId}
<collection property="orderItems" ofType="OrderItem">
select * from order_items where order_id = #{orderId}
</collection>
</select>
```
其中,`<collection>`标签用于指定嵌套查询的结果集类型和SQL语句,`property`属性用于指定将查询结果映射到哪个属性上。
mybatis 映射子查询
### MyBatis 中的子查询映射
在 MyBatis 中,可以通过 `<select>` 标签实现子查询映射。这允许在一个 SQL 查询中嵌套另一个查询来获取复杂的数据结构。
#### 实现方式
为了展示如何通过 MyBatis 进行子查询映射,下面提供了一个具体的例子:
假设存在两个表 `orders` 和 `users`,其中 `orders` 表记录订单信息而 `users` 表存储用户详情。现在需求是从 `orders` 表读取特定 ID 的订单,并同时加载创建该订单用户的姓名。
##### 映射文件配置 (OrderMapper.xml)
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.OrderMapper">
<!-- 定义结果映射 -->
<resultMap type="com.example.model.Order" id="orderResultMap">
<id property="orderId" column="order_id"/>
<result property="amount" column="total_amount"/>
<!-- 使用 association 来处理一对一关系 -->
<association property="createdByUser" javaType="com.example.model.User">
<id property="userId" column="user_id"/>
<result property="name" column="username"/>
</association>
</resultMap>
<!-- 子查询语句定义 -->
<select id="getOrderByIDWithCreatorName" resultMap="orderResultMap">
SELECT o.order_id,
o.total_amount,
u.user_id,
u.username
FROM orders AS o
LEFT JOIN (
SELECT user_id, username FROM users WHERE status = 'active'
) AS u ON o.created_by = u.user_id
WHERE o.order_id = #{id}
</select>
</mapper>
```
上述 XML 配置展示了怎样利用 MyBatis 的关联 (`<association>`) 功能以及内联子查询完成数据检索[^1]。
##### 测试类编写
对于上面提到的功能,在 Java 测试类里可以这样调用:
```java
package com.example.test;
import com.example.mapper.OrderMapper;
import com.example.model.Order;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
public class OrderTest {
@Test
public void testGetOrderByIDWithCreatorName() throws Exception {
String resource = "mybatis-config.xml";
try (InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSession session = new SqlSessionFactoryBuilder().build(inputStream).openSession()) {
OrderMapper mapper = session.getMapper(OrderMapper.class);
Order order = mapper.getByIDWithCreatorName(1L);
System.out.println(order.toString());
}
}
}
```
这段代码片段说明了如何设置并运行一个简单的单元测试去验证子查询功能是否按预期工作[^2]。
阅读全文
相关推荐















