如何使用SimpleJdbcInsert和MapSqlParameterSource实现批量插入?
使用SimpleJdbcInsert + MapSqlParameterSource实现批量插入
既然你已经搞定了单条插入,那批量操作其实就是在单条的基础上,把多个参数源收集起来,调用SimpleJdbcInsert的批量执行方法就行,具体步骤如下:
1. 确认你的SimpleJdbcInsert基础配置
首先确保你已经正确初始化了SimpleJdbcInsert,比如指定目标表、要插入的列(可选,但推荐明确指定,避免因表结构变更出问题):
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate) .withTableName("your_target_table") .usingColumns("column_a", "column_b", "column_c");
2. 收集多个MapSqlParameterSource实例
用一个集合(比如ArrayList)来存放所有要插入的参数源。你可以手动逐个创建,也可以通过遍历业务对象列表批量生成:
方式一:手动添加多条记录的参数
List<MapSqlParameterSource> batchParams = new ArrayList<>(); // 第一条记录的参数 MapSqlParameterSource param1 = new MapSqlParameterSource() .addValue("column_a", "user_001") .addValue("column_b", 28) .addValue("column_c", LocalDateTime.now()); batchParams.add(param1); // 第二条记录的参数 MapSqlParameterSource param2 = new MapSqlParameterSource() .addValue("column_a", "user_002") .addValue("column_b", 32) .addValue("column_c", LocalDateTime.now()); batchParams.add(param2); // 继续添加更多记录...
方式二:通过业务对象列表批量生成参数
如果你的数据来自业务对象集合,用Stream流处理会更简洁高效:
// 假设你有一个业务实体列表 List<User> userList = getUserListToInsert(); List<MapSqlParameterSource> batchParams = userList.stream() .map(user -> new MapSqlParameterSource() .addValue("column_a", user.getUsername()) .addValue("column_b", user.getAge()) .addValue("column_c", user.getCreateTime())) .collect(Collectors.toList());
3. 执行批量插入
调用SimpleJdbcInsert的executeBatch方法,把集合转成SqlParameterSource数组传入即可:
// 执行批量插入,返回每条记录的插入结果计数(通常1表示插入成功) int[] insertResults = jdbcInsert.executeBatch(batchParams.toArray(new MapSqlParameterSource[0]));
一些实用注意事项
- 列名一致性:所有
MapSqlParameterSource中的键(列名)必须和你usingColumns指定的列,或者表的实际列名完全匹配,否则会抛出SQL语法异常。 - 结果数组解读:返回的
int[]数组中,每个元素对应批量中对应位置记录的插入结果,大多数数据库驱动中,1表示插入成功,0表示未生效。 - 主键生成限制:如果你的表有自增主键,并且配置了
usingGeneratedKeyColumns,要注意executeBatch方法不会返回生成的主键。如果需要获取批量插入的主键,你可能需要改用JdbcTemplate的batchUpdate配合自定义PreparedStatementCreator实现,这属于进阶场景。 - 批量大小控制:批量插入的性能远优于单条循环插入,但建议控制每次批量的大小(比如1000条以内),避免一次性提交过多数据导致数据库负载过高。
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

