myBatis使用foreach批量插入数据

本文介绍了如何使用MyBatis的foreach指令进行批量插入操作,特别是在参数不全为循环项时的处理。作者通过实例展示了如何将数据封装到Map中,然后在XML映射文件中配置INSERT语句,利用foreach遍历Map中的某个属性进行批量插入,解决了当某些字段在插入时保持不变的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

亲测可用,若有疑问请私信

官方文档中为foreach提供的示例是select的时候循环拼接IN语句,并没有对foreach中的每个属性进行解释,通过其他文章(http://my.oschina.net/linuxred/blog/38802)对各个属性有了部分了解,但是里面没有提到如果传入的参数不只是提供给foreach的时候该怎么做,我正好遇到这个需求,需要批量插入数据,其中product_id是每次都一样的,每次不同的数据为bookCity,通过测试后通过将数据封装成Map解决了问题:
Map<String, Object> parames = new HashMap<String, Object>();
parames.put("product_id", product_id);//product_id是一个String
parames.put("cityArr", cityArr);//cityArr是一个String[]
sqlSession.insert("com.lantu.mybatis.product.addBookCity", parames);
XML:


<insert id="addBookCity" parameterType="HashMap">
    INSERT INTO lt_product_city (product_id, city_id) VALUES
    <foreach collection="cityArr" item="bookCity" index="index" separator=",">
        (#{product_id}, #{bookCity})
    </foreach>
</insert>
其中collection中需要配置为HashMap中的key
 

### MyBatis使用 `foreach` 实现批量插入的写法 在 MyBatis 中,`foreach` 是一个非常强大的标签,可以用于循环处理集合数据。以下是一个完整的示例,展示如何使用 `foreach` 标签实现批量插入操作。 #### SQL Mapper 配置 在 MyBatisXML 映射文件中,可以通过 `<insert>` 标签结合 `foreach` 来实现批量插入。以下是具体代码示例: ```xml <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO info_notice (id, title, content, nick_name) VALUES <foreach collection="list" item="item" separator=","> (#{item.id,jdbcType=VARCHAR}, #{item.title,jdbcType=VARCHAR}, #{item.content,jdbcType=VARCHAR}, (SELECT nick_name FROM user_info WHERE user_id = #{item.userId,jdbcType=VARCHAR})) </foreach> </insert> ``` #### 说明 1. 上述代码中,`collection="list"` 表示传入的参数是一个列表,`item="item"` 表示每次循环时的单个元素[^1]。 2. `separator=","` 指定了每个插入语句之间的分隔符为逗号,确保生成的 SQL 语法正确[^2]。 3. 在插入的字段中,`nick_name` 是通过子查询从 `user_info` 表中动态获取的,避免了在服务层进行多次查询的操作[^1]。 #### Java 代码调用 在服务层或 DAO 层中,可以通过传递一个包含多个对象的列表来调用上述方法。例如: ```java List<Notice> noticeList = new ArrayList<>(); // 填充 noticeList 数据... noticeMapper.batchInsert(noticeList); ``` #### 注意事项 1. 如果数据库对单条 SQL 的长度有限制,则需要预估 `list` 的大小,并根据实际情况调整批量插入的策略[^3]。 2. 子查询 `(SELECT nick_name FROM user_info WHERE user_id = #{item.userId})` 可能会影响性能,建议在数据量较大时优化查询逻辑或使用缓存机制[^1]。 #### 示例实体类 假设 `Notice` 类定义如下: ```java public class Notice { private String id; private String title; private String content; private String userId; // 对应 user_info 表中的 user_id // Getters and Setters } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值