mybatisplus自定义批量插入sql
时间: 2025-04-01 15:05:10 浏览: 26
### MyBatisPlus 自定义批量插入 SQL 实现方式
在 MyBatisPlus 中,虽然提供了 `insertBatchSomeColumn` 方法用于批量插入数据,但它并不支持分批处理,可能导致 SQL 语句过长而超出数据库限制。因此,为了实现更高效的批量插入功能,可以采用自定义的方式完成。
以下是具体的实现方案:
#### 1. 使用 XML 配置文件编写自定义 SQL
通过 MyBatis 的 `<insert>` 标签,在 XML 文件中定义批量插入的 SQL 语句[^2]。这种方式允许开发者灵活控制 SQL 的结构和逻辑。
```xml
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO your_table (column1, column2, column3)
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.column1}, #{item.column2}, #{item.column3})
</foreach>
</insert>
```
上述代码片段展示了如何利用 `<foreach>` 标签动态生成多组 `(value1, value2)` 形式的参数列表。
---
#### 2. Java 层调用自定义方法
在 Mapper 接口中声明对应的方法,并确保其签名与 XML 中定义的一致。
```java
public interface YourMapper extends BaseMapper<YourEntity> {
void batchInsert(@Param("list") List<YourEntity> list);
}
```
随后可以在 Service 层调用该方法并传入待插入的数据集合。
---
#### 3. 处理大批量数据时的优化策略
当需要插入大量数据时,为了避免单次 SQL 过于庞大而导致性能下降或报错,建议引入分批次机制[^4]。具体做法如下:
- **禁用自动提交**:减少每次事务提交带来的开销。
- **手动分割数据集**:按固定大小拆分原始数据列表。
示例代码如下:
```java
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
@Component
public class BatchInsertService {
private final JdbcTemplate jdbcTemplate;
public BatchInsertService(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void performBatchInsert(List<YourEntity> dataList, int batchSize) {
jdbcTemplate.execute(connection -> {
try {
connection.setAutoCommit(false); // 关闭自动提交模式[^3]
String sql = "INSERT INTO your_table (column1, column2, column3) VALUES (?, ?, ?)";
PreparedStatement ps = connection.prepareStatement(sql);
for (int i = 0; i < dataList.size(); i++) {
YourEntity entity = dataList.get(i);
ps.setObject(1, entity.getColumn1());
ps.setObject(2, entity.getColumn2());
ps.setObject(3, entity.getColumn3());
ps.addBatch();
if ((i + 1) % batchSize == 0 || (i + 1) == dataList.size()) {
ps.executeBatch();
ps.clearBatch();
}
}
connection.commit(); // 提交整个事务
} catch (SQLException e) {
connection.rollback(); // 出现异常回滚
throw e;
}
return null;
});
}
}
```
此代码实现了基于 JDBC 的分批插入逻辑,能够有效应对大规模数据场景下的性能瓶颈问题。
---
### 总结
以上介绍了两种主要的自定义批量插入方式:一种是借助 MyBatis 的 XML 配置文件配合 `<foreach>` 动态生成 SQL;另一种则是结合 JDBC 和事务管理的手动分批插入法。两者各有优劣,可根据实际需求选择合适的解决方案。
阅读全文
相关推荐


















