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

MyBatis 批量插入數據完整實戰指南:XML 配置與 Java 代碼詳解

     編輯:Java 綜合教學

前言

在企業級開發中,批量插入數據是提升數據庫寫入性能的常用手段。MyBatis 作為主流持久層框架,通過 <foreach> 標籤能優雅地實現批量操作。本文將通過完整的 XML 配置、實體類定義與測試代碼,詳細講解如何在 MyBatis 中實現高效的批量插入。

一、Mapper XML 映射文件配置

首先定義映射文件 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>

關鍵點解析:

  • namespace="test":對應 Mapper 接口的完全限定名,代理開發時必須一致。
  • parameterType="java.util.List":接收 List 集合作為輸入參數。
  • collection="list":固定寫法,MyBatis 會自動將傳入的 List 封裝為 key 為 "list" 的 Map。
  • item="item":遍歷時的單個元素別名,OGNL 表達式中通过 item.id、item.username 取值。
  • separator=",":多組 VALUES 之間自動拼接逗號,避免手動拼接 SQL 的麻煩。

二、實體類 User.java

標準的 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(); }
}

三、測試類 InsertTest.java

通過 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(); // 釋放資源
        }
    }
}

注意事項:

  1. MyBatis 默認不自動提交事務,必須顯式調用 sqlSession.commit()。
  2. 生產環境建議使用連接池(如 Druid、HikariCP)並配置事務管理器(Spring 管理事務)。
  3. 大數據量批量插入時,可分批提交(如每 1000 條 commit 一次),防止內存溢出或事務過大導致鎖等待。

四、總結

MyBatis 的 <foreach> 標籤極大地簡化了批量插入的 SQL 編寫。掌握其屬性含義(collection、item、separator 等)並結合事務控制,即可在項目中高效實現批量寫入。後續可進一步優化:結合 ExecutorType.BATCH 重用 PreparedStatement,或使用 MyBatis-Plus 等增強工具簡化代碼。

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