在企業級開發中,批量插入數據是提升數據庫寫入性能的常用手段。MyBatis 作為主流持久層框架,通過 <foreach> 標籤能優雅地實現批量操作。本文將通過完整的 XML 配置、實體類定義與測試代碼,詳細講解如何在 MyBatis 中實現高效的批量插入。
首先定義映射文件 User.xml,核心在於 insert 語句中使用 foreach 遍歷集合參數:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<!-- 批量插入用戶信息 -->
<insert id="addUserBatch" useGeneratedKeys="true" parameterType="java.util.List">
insert into user (id, first_name)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.id}, #{item.username})
</foreach>
</insert>
</mapper>
關鍵點解析:
item.id、item.username 取值。標準的 POJO 類,包含 id、username 字段及 Getter/Setter 方法:
package entity;
import java.util.Date;
public class User {
private Integer id;
private String username;
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username == null ? null : username.trim(); }
}
通過 SqlSessionFactoryBuilder 構建會話工廠,開啟會話並調用映射語句完成批量插入:
package entity;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class InsertTest {
public static void main(String[] args) {
String resource = "SqlMapConfig.xml"; // MyBatis 全局配置文件
InputStream inputStream = null;
SqlSession sqlSession = null;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
// 構造測試數據
List<User> users = new ArrayList<>();
User user1 = new User(); user1.setId(2); user1.setUsername("test");
User user2 = new User(); user2.setId(3); user2.setUsername("test2");
users.add(user1); users.add(user2);
// 調用映射文件中 id 為 addUserBatch 的語句
sqlSession.insert("test.addUserBatch", users);
sqlSession.commit(); // 手動提交事務
System.out.println("批量插入成功!");
} catch (Exception e) {
e.printStackTrace();
if (sqlSession != null) sqlSession.rollback(); // 異常回滾
} finally {
if (sqlSession != null) sqlSession.close(); // 釋放資源
}
}
}
注意事項:
sqlSession.commit()。MyBatis 的 <foreach> 標籤極大地簡化了批量插入的 SQL 編寫。掌握其屬性含義(collection、item、separator 等)並結合事務控制,即可在項目中高效實現批量寫入。後續可進一步優化:結合 ExecutorType.BATCH 重用 PreparedStatement,或使用 MyBatis-Plus 等增強工具簡化代碼。