Mybatis批量新增詳解

一、mybatis批量新增sql語句

在進行mybatis批量新增時,我們需要先了解mybatis批量新增的sql語句是怎樣的。在mybatis中,批量新增使用的是insert標籤,其中包含了collection和foreach兩個標籤。collection用來指定要插入的數據集合,foreach則用於對數據集合進行遍歷。

<insert id="insertList">
   insert into table_name(field1,field2,...)
   values
   <foreach collection="list" item="item" separator=",">
     (#{item.field1}, #{item.field2}, ...)
   </foreach>
</insert>

在上面的sql語句中,insertList是新增語句的唯一標識符,list是數據集合的名字,item則是數據集合中的單個數據對象。separator則是數據之間的分隔符,在本例中表示每個數據對象之間使用逗號分隔。

二、mybatis的批量新增

在mybatis中,批量新增數據是非常容易的。只需要在mapper.xml文件中編寫批量新增sql語句,並在Mapper介面中定義對應方法即可。

假設我們有一個User實體類,包含id、name、age三個屬性。下面是批量新增User的一個簡單示例。

//Mapper介面
public interface UserMapper {
    void batchInsert(List<User> userList);
}

//Mapper.xml文件中的sql語句
<insert id="batchInsert">
    insert into user(name,age)
    values
    <foreach collection="list" item="user" separator=",">
        (#{user.name},#{user.age})
    </foreach>
</insert>

在上面的示例中,我們定義了一個批量插入的方法batchInsert,該方法接受一個User列表作為參數,並在Mapper.xml文件中使用foreach語句進行遍歷。

三、mybatis批量新增數據太大

在實際開發中,我們可能會遇到批量新增數據量太大的問題。此時,我們可能需要拆分數據,分批進行插入。例如,每次只插入1000條數據。

下面是一個示例,演示了如何分批插入數據。

//Mapper介面
public interface UserMapper {
    void batchInsert(List<User> userList);
}

//Mapper.xml文件中的sql語句
<insert id="batchInsert">
    insert into user(name,age)
    values
    <foreach collection="list" item="user" separator=",">
        (#{user.name},#{user.age})
    </foreach>
</insert>
//Java代碼
public static void insertBatchBySqlSessionTemplate(List<User> list, int batchCount) {
    SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
    try {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int batchLastIndex = batchCount;
        for (int index = 0; index < list.size();) {
            if (batchLastIndex > list.size()) {
                batchLastIndex = list.size();
                mapper.batchInsert(list.subList(index, batchLastIndex));
                sqlSession.commit();
                break;
            } else {
                mapper.batchInsert(list.subList(index, batchLastIndex));
                sqlSession.commit();
                index = batchLastIndex;
                batchLastIndex = index + (batchCount - 1);
            }
        }
    } finally {
        sqlSession.close();
    }
}

上面的代碼中,我們使用了sqlSession的batch模式進行批量插入。在循環過程中,我們將數據拆分為多個小批次,每個小批次插入batchCount條數據。注意,在循環結束後需要手動提交一次事務。

四、mybatis批量新增報參數沒發現

在進行mybatis批量新增時,可能會遇到參數沒發現的異常。這通常是由於我們沒有正確地配置mybatis的參數類型所造成的。

在mapper.xml文件中,我們需要為insert語句配置參數類型,如果使用了JavaBean進行數據綁定,則可以使用parameterType屬性指定JavaBean的全路徑。

<insert id="batchInsert" parameterType="com.xxx.User">
    insert into user(name,age)
    values
    <foreach collection="list" item="user" separator=",">
        (#{user.name},#{user.age})
    </foreach>
</insert>

五、mybatis批量新增數據

mybatis批量新增數據的效率是非常高的,因為它是通過SQL的批量操作實現的,而非循環的單個操作。下面是一個簡單的數據對比,展示了批量插入和單個插入所需時間的差別。

//單個插入
for (int i = 0; i < 10000; i++) {
    User user = new User();
    user.setName("user" + i);
    user.setAge(i);
    userMapper.insert(user);
}

//批量插入
List<User> userList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
    User user = new User();
    user.setName("user" + i);
    user.setAge(i);
    userList.add(user);
}
userMapper.batchInsert(userList);

在上面的示例中,我們分別進行了單個插入和批量插入操作。結果表明,批量插入所需的時間僅為單個插入所需時間的1/4。

六、mybatis批量新增效率

mybatis批量新增的效率非常高,這也是它受到普及的原因之一。因為批量操作可以一次性將多條數據插入到資料庫中,同時只需要建立一次連接,相對於循環單個插入而言,大大提高了系統的整體性能。

為了進一步提高mybatis批量新增的效率,我們可以在開發中注意以下幾點:

  1. 盡量減少資料庫IO操作。
  2. 盡量使用in批量操作,減少資料庫查詢次數。
  3. 盡量使用純SQL操作,避免使用ORM框架等。
  4. 使用緩存,避免重複查詢。

七、mybatis批量新增一萬條數據

mybatis批量新增一萬條數據,實際上也是非常容易的。只需要編寫一個新增方法,同時將數據拆分為多個小批次插入資料庫即可。

//新增方法
public void batchInsert(List<User> userList) {
    int times = userList.size() % 5000 == 0 ? userList.size() / 5000 : userList.size() / 5000 + 1;
    for (int i = 0; i < times; i++) {
        int fromIndex = i * 5000;
        int toIndex = (i + 1) * 5000;
        if (toIndex > userList.size()) {
            toIndex = userList.size();
        }
        List<User> subList = userList.subList(fromIndex, toIndex);
        userMapper.batchInsert(subList);
    }
}

在上面的代碼中,我們將數據拆分為多個小批次,每個小批次插入5000條數據。由於批量插入的效率非常高,因此不必擔心性能問題。

八、mybatis批量新增修改

mybatis批量新增修改也非常容易。在mapper.xml文件中,我們只需要編寫一條新增修改的sql語句,同時在Mapper介面中定義對應的方法即可。

//Mapper介面
public interface UserMapper {
    void batchInsertOrUpdate(List<User> userList);
}

//Mapper.xml文件中的sql語句
<insert id="batchInsertOrUpdate">
    insert into user(name,age,phone)
    values
    <foreach collection="list" item="user" separator=",">
        (#{user.name},#{user.age},#{user.phone})
        on duplicate key update
        name = values(name), age = values(age), phone = values(phone)
    </foreach>
</insert>

在上面的代碼中,我們將新增修改的sql語句中添加了一個on duplicate key update子句,用於在有重複數據時執行修改操作。

九、mybatis批量新增sql

mybatis的批量新增操作使用的是insert標籤,同時還需要使用foreach標籤對數據集合進行遍歷。下面是一個簡單的例子,演示了mybatis批量新增sql語句的寫法。

<insert id="batchInsert">
    insert into user(name,age)
    values
    <foreach collection="list" item="user" separator=",">
        (#{user.name},#{user.age})
    </foreach>
</insert>

在上面的代碼中,我們定義了一個批量新增的sql語句batchInsert,使用了foreach標籤對user列表進行遍歷,並進行數據插入。在新增數據時,採用了#{user.name}的方式進行數據綁定。

十、總結

通過本文的批量新增詳解,我們了解了mybatis批量新增的sql語句、批量新增數據太大、報參數未發現、批量新增效率等方面的內容。同時,本文還給出了多個實例,示範了如何編寫mybatis批量新增的sql語句、如何根據數據量進行數據拆分、如何使用批量新增修改等操作。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/257362.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:45
下一篇 2024-12-15 12:45

相關推薦

  • 理解Mybatis中的SQL Limit用法

    Mybatis是一種非常流行的ORM框架,提供了SQL映射配置文件,可以使用類似於傳統SQL語言的方式編寫SQL語句。其中,SQL的Limit語法是一個非常重要的知識點,能夠實現分…

    編程 2025-04-29
  • Java批量執行SQL時Communications Link Failure Socket is Closed問題解決辦法

    對於Java開發人員來說,批量執行SQL是一個經常會遇到的問題。但是,有時候我們會遇到「Communications link failure socket is closed」這…

    編程 2025-04-28
  • PowerDesigner批量修改屬性

    本文將教您如何使用PowerDesigner批量修改實體、關係等對象屬性。 一、選擇要修改的對象 首先需要打開PowerDesigner,並選擇要修改屬性的對象。可以通過以下兩種方…

    編程 2025-04-27
  • Python批量導入資料庫

    本文將介紹Python中如何批量導入資料庫。首先,對於數據分析和挖掘領域,資料庫中批量導入數據是一個必不可少的過程。這種高效的導入方式可以極大地提高數據挖掘、機器學習等任務的效率。…

    編程 2025-04-27
  • 如何批量下載某博主全部微博相冊

    這篇文章將教大家如何通過Python代碼批量下載某博主全部微博相冊。 一、獲取微博相冊鏈接 首先,我們需要獲取到某博主的所有微博相冊鏈接。可以通過以下代碼獲取到某博主的首頁鏈接: …

    編程 2025-04-27
  • Python批量爬取網頁內容

    Python是當前最流行的編程語言之一,其在數據處理、自動化任務、網路爬蟲等場景下都有廣泛應用。本文將介紹如何使用Python批量爬取網頁內容,方便獲取大量有用的數據。 一、安裝所…

    編程 2025-04-27
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25

發表回復

登錄後才能評論