首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MyBatis 批量插入 List 集合:foreach 標籤實戰

     編輯:程式設計綜合問答

在 MyBatis 中對 Oracle(或其他數據庫)進行批量插入,核心是使用 `` 標籤遍歷集合構建 `VALUES` 子句。本文給出通用 Mapper XML 寫法及注意事項。

Mapper XML 範例

<mapper namespace="com.example.dao.UserMapper">
    <insert id="batchInsert" parameterType="java.util.List">
        INSERT INTO t_user (id, username, email, create_time)
        VALUES
        <foreach collection="list" item="user" separator=",">
            (#{user.id}, #{user.username}, #{user.email}, #{user.createTime})
        </foreach>
    </insert>
</mapper>

關鍵屬性解析

屬性說明本例值
collection要遍歷的集合參數名。若參數是 List,默認名為 `list`;若是 Map,需指定 key。`list`
item遍歷出的單個元素別名,用於 `#{item.property}` 訪問屬性。`user`
separator元素之間的分隔符,批量插入必須為逗號 `,`。`,`
open / close(可選)整個遍歷結果的前後綴,如 `(` 和 `)`。此處直接放在 `VALUES` 後不需要。—

Oracle 特殊語法適配

Oracle 不支持標準 `VALUES (...), (...)` 多行插入語法(12c 前)。需改用 `INSERT ALL ... SELECT * FROM DUAL`:

<insert id="batchInsertOracle" parameterType="java.util.List">
    INSERT ALL
    <foreach collection="list" item="user">
        INTO t_user (id, username, email, create_time)
        VALUES (#{user.id}, #{user.username}, #{user.email}, #{user.createTime})
    </foreach>
    SELECT * FROM DUAL
</insert>

或使用 `UNION ALL` 子查詢(性能略差)。

Dao 接口與調用

// Mapper 接口
void batchInsert(@Param("list") List userList);

// Service 調用
List users = buildUsers(1000);
userMapper.batchInsert(users);

性能優化建議

  1. 批次大小控制: 單次批量建議 500-1000 條,超過則分批提交,防止 SQL 過長或事務日誌膨脹。
  2. 關閉自動提交: 在 Service 層使用 `@Transactional` 或手動控制事務,確保一次提交。
  3. 使用 ExecutorType.BATCH: MyBatis 配置 `SqlSessionFactory` 時設置 `defaultExecutorType="BATCH"`,配合 `PreparedStatement` 重用,大幅提升批量寫入速度。

常見坑

  • 參數名不匹配:`@Param("list")` 與 `collection="list"` 必須一致。
  • 實體類屬性名與 `#{user.xxx}` 不一致(駝峰 vs 下劃線),需開啟 `mapUnderscoreToCamelCase=true` 或手動映射。
  • Oracle 序列/主鍵生成策略需在 `` 中配置 `useGeneratedKeys`/`keyProperty` 或 ``。

掌握 `` 靈活用法,批量插入不再是難題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved