mybatis collection 携带参数
时间: 2025-02-19 19:18:07 浏览: 83
### MyBatis `collection` 标签传递参数
在MyBatis中,当涉及到一对多的关系查询时,可以使用`<collection>`标签来处理这种情况。为了使`<collection>`能够正常工作并接收来自父查询的结果作为子查询的输入条件,通常会利用`column`属性。
#### 利用 column 属性传递单个字段值
假设有一个场景是从订单表中获取所有用户的订单详情列表,在此过程中需要通过用户ID去查找对应的订单记录。此时可以在映射文件里这样设置:
```xml
<!-- UserMapper.xml -->
<select id="getUserWithOrders" resultMap="UserOrderResult">
SELECT * FROM users WHERE user_id = #{userId}
</select>
<resultMap id="UserOrderResult" type="User">
<id property="userId" column="user_id"/>
<!-- other properties mapping... -->
<collection
property="orders"
ofType="Order"
select="getOrdersByUserId"
column="user_id"/> <!-- 将当前行的'user_id'传入到子查询 -->
</resultMap>
```
上述代码片段展示了如何基于用户ID执行嵌套查询以填充用户的订单集合[^4]。
#### 多列组合成复合键的情况
有时候可能不仅仅依赖单一列来进行关联操作,而是要依据多个列共同构成唯一标识符。这时可以通过创建自定义SQL语句的方式把所需列拼接起来形成新的字符串形式的关键字,并将其赋值给目标方法调用;或者是直接将这些列都暴露出来供下游组件消费。
例如,如果有两个表分别是班级(Class)和学生(Student),其中每个班有唯一的年级级号(gradeNo)+班级编号(classNo)组成其主键,则可按如下方式进行配置:
```xml
<!-- ClassMapper.xml -->
<select id="getClassByIds" parameterType="map" resultMap="ClassStudentResult">
SELECT c.*, s.*
FROM classes AS c LEFT JOIN students AS s ON c.grade_no=s.grade_no AND c.class_no=s.class_no
WHERE c.grade_no=#{gradeNo} AND c.class_no=#{classNo}
</select>
<resultMap id="ClassStudentResult" type="Class">
<association property="students" javaType="ArrayList">
<collection
property="studentList"
ofType="Student"
select="getStudentsOfClass"
column="{gradeNo=grade_no, classNo=class_no}" />
</association>
</resultMap>
```
在这个例子中,不仅实现了跨表联结查询的功能,还巧妙地运用了`column`属性接受多列数据作为下层查询函数(`getStudentsOfClass`)所需的实参[^3]。
阅读全文
相关推荐









