Java實現(xiàn)JDBC向數(shù)據(jù)庫批量插入
使用Java數(shù)據(jù)庫連接(JDBC)實現(xiàn)批量插入可以提高數(shù)據(jù)庫操作的效率,特別是在需要一次性插入多條數(shù)據(jù)時。
一、JDBC實現(xiàn)批量插入幾種方式
使用PreparedStatement的批處理: 這是最常見的批量插入方式之一,適用于大多數(shù)數(shù)據(jù)庫。你可以使用
addBatch
方法將多個插入語句添加到PreparedStatement對象中,然后使用executeBatch
執(zhí)行批處理操作。這個方式在上一個回答中已經(jīng)進行了詳細說明。使用批處理語句: 一些數(shù)據(jù)庫支持批處理語句,例如MySQL的
INSERT INTO ... VALUES (?, ?), (?, ?), ...
語法。你可以構建這樣的SQL語句,一次性插入多個數(shù)據(jù)行。
String sql = "INSERT INTO your_table (column1, column2) VALUES (?, ?), (?, ?), (?, ?)"; PreparedStatement preparedStatement = connection.prepareStatement(sql); // 設置占位符的值 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
方法將多個SQL語句添加到Statement
對象中,然后使用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方法使用
PreparedStatement
的addBatch
方法用于將多個SQL語句添加到批處理中,以便一次性執(zhí)行多個SQL操作。這可以顯著提高數(shù)據(jù)庫操作的性能,尤其是在需要插入、更新或刪除多個數(shù)據(jù)行時。
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對象,并設置為批處理模式 preparedStatement = connection.prepareStatement(sql); connection.setAutoCommit(false); // 設置為手動提交 // 循環(huán)添加多個批處理操作 for (int i = 0; i < 10; i++) { // 設置占位符的值 preparedStatement.setString(1, "value" + i); preparedStatement.setString(2, "value" + (i * 2)); // 添加到批處理中 preparedStatement.addBatch(); } // 執(zhí)行批處理 int[] batchResults = preparedStatement.executeBatch(); // 手動提交事務 connection.commit(); // 檢查批處理執(zhí)行結果 for (int result : batchResults) { if (result == PreparedStatement.SUCCESS_NO_INFO || result == PreparedStatement.EXECUTE_FAILED) { // 處理失敗的情況 } } } catch (SQLException e) { e.printStackTrace(); try { // 發(fā)生異常時回滾事務 if (connection != null) { connection.rollback(); } } catch (SQLException ex) { ex.printStackTrace(); } } finally { try { // 關閉PreparedStatement和Connection if (preparedStatement != null) { preparedStatement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
在上述示例中,我們創(chuàng)建了一個PreparedStatement
對象,將多個插入操作添加到批處理中,并最后執(zhí)行批處理。注意以下幾點:
- 使用
setString
等方法設置占位符的值,然后使用addBatch
方法將每個操作添加到批處理中。 - 執(zhí)行批處理操作后,
executeBatch
返回一個整數(shù)數(shù)組,其中包含每個批處理操作的執(zhí)行結果。你可以根據(jù)需要處理失敗的情況。 - 為了保持數(shù)據(jù)的一致性,我們使用
connection.setAutoCommit(false)
關閉了自動提交模式,手動提交事務,以便在所有操作成功后一起提交。 - 在異常情況下,我們使用
connection.rollback()
回滾事務,以避免數(shù)據(jù)不一致。
connection.setAutoCommit
是用于設置JDBC連接的自動提交模式的方法。在JDBC中,自動提交是指每個SQL操作是否都立即提交到數(shù)據(jù)庫,或者是否需要手動調用commit
方法來提交事務。
默認情況下,JDBC連接的自動提交模式是打開的(true
)。這意味著每個SQL操作都會立即提交到數(shù)據(jù)庫,形成一個獨立的事務。這對于簡單的操作非常方便,但在某些情況下,你可能希望將多個SQL操作組合成一個事務以確保數(shù)據(jù)的一致性。
你可以使用connection.setAutoCommit(false)
來關閉自動提交模式,這樣就可以手動管理事務。一旦關閉了自動提交,你可以通過調用connection.commit()
來提交事務,將之前的SQL操作組合成一個事務。
三、Statement 和PreparedStatement 區(qū)別
Statement
和PreparedStatement
是Java JDBC(Java數(shù)據(jù)庫連接)中兩種執(zhí)行SQL語句的方式,它們在使用和性能上有一些重要的區(qū)別。
Statement:
靜態(tài)SQL語句:
Statement
用于執(zhí)行靜態(tài)SQL語句,這意味著SQL查詢在編寫代碼時已經(jīng)被定義好,不能包含動態(tài)參數(shù)。不安全: 由于
Statement
不支持參數(shù)化查詢,因此它容易受到SQL注入攻擊。如果直接將用戶提供的數(shù)據(jù)拼接到SQL語句中,可能會導致安全問題。性能問題: 在需要多次執(zhí)行相同的SQL語句時,
Statement
的性能通常較差。每次執(zhí)行時,數(shù)據(jù)庫都需要解析和編譯SQL語句。代碼可讀性: 由于SQL語句直接嵌入在Java代碼中,
Statement
的代碼通常比較難讀懂,維護困難。
PreparedStatement:
動態(tài)SQL語句:
PreparedStatement
用于執(zhí)行動態(tài)SQL語句,它支持參數(shù)化查詢。你可以使用占位符來表示參數(shù),然后在執(zhí)行之前設置這些參數(shù)的值。這使得你可以輕松地構建動態(tài)查詢,根據(jù)不同的輸入執(zhí)行不同的查詢。安全性: 由于參數(shù)化查詢,
PreparedStatement
可以防止SQL注入攻擊,因為參數(shù)值不會直接嵌入到SQL語句中,而是通過參數(shù)傳遞。性能優(yōu)化:
PreparedStatement
通常比Statement
更高效,因為數(shù)據(jù)庫可以緩存已編譯的SQL語句,而且每次只需傳遞參數(shù)值,而不是重新解析和編譯SQL語句。代碼可讀性: 使用
PreparedStatement
可以使代碼更清晰和易于維護,因為SQL語句與參數(shù)值分離,降低了代碼的復雜性。
綜上所述,如果你需要執(zhí)行動態(tài)SQL查詢、提高安全性和性能,通常建議使用PreparedStatement
。Statement
適用于那些不需要參數(shù)化查詢,只需要執(zhí)行靜態(tài)SQL語句的情況。
到此這篇關于Java實現(xiàn)JDBC向數(shù)據(jù)庫批量插入的文章就介紹到這了,更多相關Java JDBC批量插入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot SSO輕松實現(xiàn)(附demo)
這篇文章主要介紹了SpringBoot SSO輕松實現(xiàn)(附demo),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01idea創(chuàng)建Springboot多模塊項目(聚合項目)
文章詳細介紹了如何在idea創(chuàng)建Springboot多模塊項目(聚合項目),包括創(chuàng)建父工程和子工程、編輯pom.xml文件、編寫代碼和測試,還介紹了如何處理Maven視圖中的層級關系,并展示了如何同時啟動多個子項目2024-11-11Spring Security 自定義短信登錄認證的實現(xiàn)
這篇文章主要介紹了Spring Security 自定義短信登錄認證的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03mybatis自定義類型處理器TypehHandler示例詳解
我們在寫mapper映射器的配置文件時,不經(jīng)意間已經(jīng)用到類型轉換,不過是mybatis幫我們完成的,下面這篇文章主要給大家介紹了關于mybatis自定義類型處理器TypehHandler的相關資料,需要的朋友可以參考下2018-09-09Spring中ApplicationEvent事件機制源碼詳解
這篇文章主要介紹了Spring中ApplicationEvent事件機制源碼詳解,Spring中與事件有關的接口和類主要包括ApplicationEvent、ApplicationListener,下面來看一下Spring中事件的具體應用,需要的朋友可以參考下2023-09-09Spring Boot與Kotlin定時任務的示例(Scheduling Tasks)
這篇文章主要介紹了Spring Boot與Kotlin定時任務的示例(Scheduling Tasks),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03SpringBoot統(tǒng)一api返回風格的實現(xiàn)
這篇文章主要介紹了SpringBoot統(tǒng)一api返回風格的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03