欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)JDBC向數(shù)據(jù)庫批量插入

 更新時(shí)間:2023年09月22日 16:38:07   作者:境里婆娑  
在Java項(xiàng)目中可能會(huì)出現(xiàn)大量向數(shù)據(jù)庫中插入的情況,本文主要介紹了Java實(shí)現(xiàn)JDBC向數(shù)據(jù)庫批量插入,具有一定的參考價(jià)值,感興趣的可以了解一下

使用Java數(shù)據(jù)庫連接(JDBC)實(shí)現(xiàn)批量插入可以提高數(shù)據(jù)庫操作的效率,特別是在需要一次性插入多條數(shù)據(jù)時(shí)。

一、JDBC實(shí)現(xiàn)批量插入幾種方式

  • 使用PreparedStatement的批處理: 這是最常見的批量插入方式之一,適用于大多數(shù)數(shù)據(jù)庫。你可以使用addBatch方法將多個(gè)插入語句添加到PreparedStatement對(duì)象中,然后使用executeBatch執(zhí)行批處理操作。這個(gè)方式在上一個(gè)回答中已經(jīng)進(jìn)行了詳細(xì)說明。

  • 使用批處理語句: 一些數(shù)據(jù)庫支持批處理語句,例如MySQL的INSERT INTO ... VALUES (?, ?), (?, ?), ...語法。你可以構(gòu)建這樣的SQL語句,一次性插入多個(gè)數(shù)據(jù)行。

String sql = "INSERT INTO your_table (column1, column2) VALUES (?, ?), (?, ?), (?, ?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 設(shè)置占位符的值
preparedStatement.setString(1, value1);
preparedStatement.setString(2, value2);
preparedStatement.setString(3, value3);
preparedStatement.setString(4, value4);
preparedStatement.setString(5, value5);
preparedStatement.setString(6, value6);
// 執(zhí)行批處理
int[] batchResults = preparedStatement.executeBatch();
  •  使用JDBC批處理API: JDBC 2.0引入了java.sql.Statement接口的批處理方法。你可以使用addBatch方法將多個(gè)SQL語句添加到Statement對(duì)象中,然后使用executeBatch方法執(zhí)行批處理操作。
Statement statement = connection.createStatement();
statement.addBatch("INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')");
statement.addBatch("INSERT INTO your_table (column1, column2) VALUES ('value3', 'value4')");
statement.addBatch("INSERT INTO your_table (column1, column2) VALUES ('value5', 'value6')");
int[] batchResults = statement.executeBatch();

二、PreparedStatement addBatch方法使用

PreparedStatementaddBatch方法用于將多個(gè)SQL語句添加到批處理中,以便一次性執(zhí)行多個(gè)SQL操作。這可以顯著提高數(shù)據(jù)庫操作的性能,尤其是在需要插入、更新或刪除多個(gè)數(shù)據(jù)行時(shí)。 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class BatchInsertExample {
    public static void main(String[] args) {
        String jdbcUrl = "jdbc:mysql://localhost:3306/tbl";
        String username = "root";
        String password = "root";
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            // 建立數(shù)據(jù)庫連接
            connection = DriverManager.getConnection(jdbcUrl, username, password);
            // SQL插入語句,使用占位符來防止SQL注入
            String sql = "INSERT INTO goods(name, price) VALUES (?, ?)";
            // 創(chuàng)建PreparedStatement對(duì)象,并設(shè)置為批處理模式
            preparedStatement = connection.prepareStatement(sql);
            connection.setAutoCommit(false); // 設(shè)置為手動(dòng)提交
            // 循環(huán)添加多個(gè)批處理操作
            for (int i = 0; i < 10; i++) {
                // 設(shè)置占位符的值
                preparedStatement.setString(1, "value" + i);
                preparedStatement.setString(2, "value" + (i * 2));
                // 添加到批處理中
                preparedStatement.addBatch();
            }
            // 執(zhí)行批處理
            int[] batchResults = preparedStatement.executeBatch();
            // 手動(dòng)提交事務(wù)
            connection.commit();
            // 檢查批處理執(zhí)行結(jié)果
            for (int result : batchResults) {
                if (result == PreparedStatement.SUCCESS_NO_INFO || result == PreparedStatement.EXECUTE_FAILED) {
                    // 處理失敗的情況
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
            try {
                // 發(fā)生異常時(shí)回滾事務(wù)
                if (connection != null) {
                    connection.rollback();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        } finally {
            try {
                // 關(guān)閉PreparedStatement和Connection
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

在上述示例中,我們創(chuàng)建了一個(gè)PreparedStatement對(duì)象,將多個(gè)插入操作添加到批處理中,并最后執(zhí)行批處理。注意以下幾點(diǎn):

  • 使用setString等方法設(shè)置占位符的值,然后使用addBatch方法將每個(gè)操作添加到批處理中。
  • 執(zhí)行批處理操作后,executeBatch返回一個(gè)整數(shù)數(shù)組,其中包含每個(gè)批處理操作的執(zhí)行結(jié)果。你可以根據(jù)需要處理失敗的情況。
  • 為了保持?jǐn)?shù)據(jù)的一致性,我們使用connection.setAutoCommit(false)關(guān)閉了自動(dòng)提交模式,手動(dòng)提交事務(wù),以便在所有操作成功后一起提交。
  • 在異常情況下,我們使用connection.rollback()回滾事務(wù),以避免數(shù)據(jù)不一致。

connection.setAutoCommit是用于設(shè)置JDBC連接的自動(dòng)提交模式的方法。在JDBC中,自動(dòng)提交是指每個(gè)SQL操作是否都立即提交到數(shù)據(jù)庫,或者是否需要手動(dòng)調(diào)用commit方法來提交事務(wù)。

默認(rèn)情況下,JDBC連接的自動(dòng)提交模式是打開的(true)。這意味著每個(gè)SQL操作都會(huì)立即提交到數(shù)據(jù)庫,形成一個(gè)獨(dú)立的事務(wù)。這對(duì)于簡單的操作非常方便,但在某些情況下,你可能希望將多個(gè)SQL操作組合成一個(gè)事務(wù)以確保數(shù)據(jù)的一致性。

你可以使用connection.setAutoCommit(false)來關(guān)閉自動(dòng)提交模式,這樣就可以手動(dòng)管理事務(wù)。一旦關(guān)閉了自動(dòng)提交,你可以通過調(diào)用connection.commit()來提交事務(wù),將之前的SQL操作組合成一個(gè)事務(wù)。

三、Statement 和PreparedStatement 區(qū)別 

StatementPreparedStatement是Java JDBC(Java數(shù)據(jù)庫連接)中兩種執(zhí)行SQL語句的方式,它們?cè)谑褂煤托阅苌嫌幸恍┲匾膮^(qū)別。

Statement:

  • 靜態(tài)SQL語句: Statement用于執(zhí)行靜態(tài)SQL語句,這意味著SQL查詢?cè)诰帉懘a時(shí)已經(jīng)被定義好,不能包含動(dòng)態(tài)參數(shù)。

  • 不安全: 由于Statement不支持參數(shù)化查詢,因此它容易受到SQL注入攻擊。如果直接將用戶提供的數(shù)據(jù)拼接到SQL語句中,可能會(huì)導(dǎo)致安全問題。

  • 性能問題: 在需要多次執(zhí)行相同的SQL語句時(shí),Statement的性能通常較差。每次執(zhí)行時(shí),數(shù)據(jù)庫都需要解析和編譯SQL語句。

  • 代碼可讀性: 由于SQL語句直接嵌入在Java代碼中,Statement的代碼通常比較難讀懂,維護(hù)困難。

PreparedStatement:

  • 動(dòng)態(tài)SQL語句: PreparedStatement用于執(zhí)行動(dòng)態(tài)SQL語句,它支持參數(shù)化查詢。你可以使用占位符來表示參數(shù),然后在執(zhí)行之前設(shè)置這些參數(shù)的值。這使得你可以輕松地構(gòu)建動(dòng)態(tài)查詢,根據(jù)不同的輸入執(zhí)行不同的查詢。

  • 安全性: 由于參數(shù)化查詢,PreparedStatement可以防止SQL注入攻擊,因?yàn)閰?shù)值不會(huì)直接嵌入到SQL語句中,而是通過參數(shù)傳遞。

  • 性能優(yōu)化: PreparedStatement通常比Statement更高效,因?yàn)閿?shù)據(jù)庫可以緩存已編譯的SQL語句,而且每次只需傳遞參數(shù)值,而不是重新解析和編譯SQL語句。

  • 代碼可讀性: 使用PreparedStatement可以使代碼更清晰和易于維護(hù),因?yàn)镾QL語句與參數(shù)值分離,降低了代碼的復(fù)雜性。

綜上所述,如果你需要執(zhí)行動(dòng)態(tài)SQL查詢、提高安全性和性能,通常建議使用PreparedStatementStatement適用于那些不需要參數(shù)化查詢,只需要執(zhí)行靜態(tài)SQL語句的情況。 

到此這篇關(guān)于Java實(shí)現(xiàn)JDBC向數(shù)據(jù)庫批量插入的文章就介紹到這了,更多相關(guān)Java JDBC批量插入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot SSO輕松實(shí)現(xiàn)(附demo)

    SpringBoot SSO輕松實(shí)現(xiàn)(附demo)

    這篇文章主要介紹了SpringBoot SSO輕松實(shí)現(xiàn)(附demo),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • idea創(chuàng)建Springboot多模塊項(xiàng)目(聚合項(xiàng)目)

    idea創(chuàng)建Springboot多模塊項(xiàng)目(聚合項(xiàng)目)

    文章詳細(xì)介紹了如何在idea創(chuàng)建Springboot多模塊項(xiàng)目(聚合項(xiàng)目),包括創(chuàng)建父工程和子工程、編輯pom.xml文件、編寫代碼和測試,還介紹了如何處理Maven視圖中的層級(jí)關(guān)系,并展示了如何同時(shí)啟動(dòng)多個(gè)子項(xiàng)目
    2024-11-11
  • Spring Security 自定義短信登錄認(rèn)證的實(shí)現(xiàn)

    Spring Security 自定義短信登錄認(rèn)證的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Security 自定義短信登錄認(rèn)證的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • mybatis自定義類型處理器TypehHandler示例詳解

    mybatis自定義類型處理器TypehHandler示例詳解

    我們?cè)趯憁apper映射器的配置文件時(shí),不經(jīng)意間已經(jīng)用到類型轉(zhuǎn)換,不過是mybatis幫我們完成的,下面這篇文章主要給大家介紹了關(guān)于mybatis自定義類型處理器TypehHandler的相關(guān)資料,需要的朋友可以參考下
    2018-09-09
  • 圖解二叉樹的三種遍歷方式及java實(shí)現(xiàn)代碼

    圖解二叉樹的三種遍歷方式及java實(shí)現(xiàn)代碼

    本篇文章主要介紹了圖解二叉樹的三種遍歷方式及java實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07
  • Spring中ApplicationEvent事件機(jī)制源碼詳解

    Spring中ApplicationEvent事件機(jī)制源碼詳解

    這篇文章主要介紹了Spring中ApplicationEvent事件機(jī)制源碼詳解,Spring中與事件有關(guān)的接口和類主要包括ApplicationEvent、ApplicationListener,下面來看一下Spring中事件的具體應(yīng)用,需要的朋友可以參考下
    2023-09-09
  • DragChartPanel可拖拽曲線應(yīng)用詳解

    DragChartPanel可拖拽曲線應(yīng)用詳解

    這篇文章主要為大家詳細(xì)介紹了DragChartPanel可拖拽曲線的應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • java編碼IDEA主題推薦

    java編碼IDEA主題推薦

    在這篇文章中,我精選了幾個(gè)比較是和?Java?編碼的?IDEA?主題供小伙伴們選擇。另外,我自己用的是?One?Dark?theme?這款,有需要的朋友可以借鑒參考下,希望大家喜歡
    2022-01-01
  • Spring Boot與Kotlin定時(shí)任務(wù)的示例(Scheduling Tasks)

    Spring Boot與Kotlin定時(shí)任務(wù)的示例(Scheduling Tasks)

    這篇文章主要介紹了Spring Boot與Kotlin定時(shí)任務(wù)的示例(Scheduling Tasks),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • SpringBoot統(tǒng)一api返回風(fēng)格的實(shí)現(xiàn)

    SpringBoot統(tǒng)一api返回風(fēng)格的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot統(tǒng)一api返回風(fēng)格的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論