首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis 批量更新實戰:Oracle 與 MySQL 兩種寫法詳解

     編輯:Java 相關知識

核心差異

MyBatis 批量更新在 Oracle 和 MySQL 中的 XML 寫法不同,關鍵在於 <foreach> 標籤的 open/close 屬性設置,以及 MySQL 需要 JDBC 連接參數支持多語句執行。

Oracle 寫法:使用 BEGIN...END 包裹

Oracle 不支持單條 SQL 多條更新語句,需用 PL/SQL 匿名塊包裹:

<update id="batchUpdate" parameterType="java.util.List">
    <foreach collection="list" item="item" index="index" 
             open="BEGIN " close=" END;" separator=";">
        UPDATE test 
        <set> test = #{item.test} + 1 </set> 
        WHERE id = #{item.id}
    </foreach>
</update>

關鍵點解析

  • open="BEGIN "、close=" END;":生成 BEGIN stmt1; stmt2; END; 結構
  • separator=";":語句間用分號分隔
  • 使用 #{item.xxx} 參數佔位符防止 SQL 注入

MySQL 寫法:直接拼接多條語句

MySQL 支持單次執行多條語句,但需開啟連接參數:

<update id="batchUpdate" parameterType="java.util.List">
    <foreach collection="list" item="item" index="index" 
             open="" close="" separator=";">
        UPDATE test 
        <set> test = #{item.test} + 1 </set> 
        WHERE id = #{item.id}
    </foreach>
</update>

必須配置:JDBC URL 添加 allowMultiQueries

jdbc:mysql://192.168.1.236:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true

若不添加 allowMultiQueries=true,執行時會拋出「can't execute multiple statements」異常。

Java 調用示例

public void batchUpdate(List<TestEntity> list) {
    sqlSession.update("namespace.batchUpdate", list);
}

// 測試數據構造
List<TestEntity> list = new ArrayList<>();
list.add(new TestEntity(1, 10));
list.add(new TestEntity(2, 20));
batchUpdate(list);

性能優化建議

  1. 批次大小控制:單次批量建議 500-1000 條,避免 SQL 過長超過數據庫限制
  2. 事務管理:確保在事務中執行,失敗全量回滾
  3. ExecutorType.BATCH:MyBatis 配置 SqlSessionFactory 使用 BATCH 模式可進一步提升性能
  4. 索引覆蓋:WHERE 條件字段務必有索引

常見坑點排查

現象原因解決
Oracle 報 ORA-00933缺少 BEGIN/END 包裹檢查 foreach open/close 屬性
MySQL 批量無效果未開啟 allowMultiQueriesJDBC URL 添加參數
參數綁定報錯用 ${} 而非 #{} 導致類型錯誤統一使用 #{} 參數佔位符

總結

MyBatis 批量更新核心在於 <foreach> 的正確配置:Oracle 需 PL/SQL 包裹,MySQL 需 JDBC 參數支持。掌握兩者差異,結合批次控制與事務管理,即可高效實現跨數據庫的批量更新需求。

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