如何在MyBatis中结合INSERT INTO SELECT与foreach批量插入数据?
解决方案:MyBatis结合foreach实现批量插入关联列表元素的需求
可以通过MyBatis的<foreach>标签结合SQL的UNION ALL来实现你的需求,核心思路是遍历元素列表,为每个元素生成对应的查询语句,再将所有查询结果合并作为插入的数据源。
正确的MyBatis映射器代码示例
<insert id="batchInsertWithElements"> INSERT INTO new_table ( order_pnr_id, order_id, reference_ticket_id, new_element ) <foreach item="elem" collection="elements" separator="UNION ALL"> SELECT order_pnr_id, order_id, reference_ticket_id, #{elem} AS new_element FROM ticket WHERE order_id = 1 </foreach> </insert>
代码说明
<foreach>标签的separator设为UNION ALL,每个元素对应的SELECT语句会被合并成一个完整的结果集。- 每个
SELECT语句中,通过#{elem} AS new_element将列表元素作为新字段的值,MyBatis会自动完成参数绑定,避免SQL注入风险。 - 假设
ticket表中order_id=1有N条数据,最终会插入N×4条数据(对应列表的4个元素)。
注意事项
- 如果元素列表可能为空,建议在调用前先判断列表是否非空,避免生成无效SQL。
- 需确保列表元素的类型与
new_element字段的数据类型匹配。
内容的提问来源于stack exchange,提问作者Robin Lee
相关产品推荐
相关产品推荐

