2012-12-12 77 views
2

我想在一個PreparedStatement中批量處理多種類型的數據庫調用。這可能嗎?Java - 如何對數據庫進行批量插入和更新

反正有做類似

PreparedStatement pstmt = connection.prepareStatement("?");

其中?可以是INSERT INTO MY_TABLE VALUES(1,2,3,4)也可以是UPDATE MY_TABLE, SET MY_VAL='1' WHERE MY_VAL IS NULL

或者我是否總是需要爲我準備好的語句指定一個表和動作?

+0

不,Java不允許這樣做 – Parth

+0

如何編寫存儲過程? –

+0

這不是一個準備好的聲明。這只是一個聲明。 – Boann

回答

3

Java將不允許您僅添加?在preparedstatement字符串參數中,如它所期望的那樣?僅用於參數給給SQL的佔位符。

對於你的情況,你可能有2個準備好的語句對象,並通過循環,你可以做出哪些一項決定打電話。所以它會像下面這樣:

PreparedStatement insertPstmt = connection.prepareStatement("INSERT INTO MY_TABLE VALUES(?,?,?,?)"); 
PreparedStatement updatePstmt = connection.prepareStatement("UPDATE MY_TABLE, SET MY_VAL=? WHERE MY_VAL IS NULL"); 

While (<condition>) { 
    If (<insert condition>) { 
    // use insert pstmt and add batch 
    } else { 
    // use update pstmt and add batch 
    } 
} 

insertPstmt.executeBatch(); 
updatePstmt.executeBatch(); 

如果您有任何插入,它依賴於更新,您可能會相應地執行批處理。這將確保更新將正常工作。我會首先考慮執行插入操作,因爲它們可能不依賴於更新。

0

在一個PreparedStatement,裝訂變量用於第一執行之後,呼叫

pstmt.addBatch(); 

然後綁定變量的下一個,每一次調用addBatch()。 然後,當你添加完批次您可以通過阿靈執行bacth

pstmt.executeBatch(); 

參見:

http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html#addBatch%28%29

http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeBatch%28%29

BTW:注入整個statment進入一個變量將無法正常工作。這個批處理機制存在重複使用每次綁定不同變量的相同語句。

0

插入和更新命令不會返回任何必須處理的數據。如果你只想在你的例子中做一些事情,你可以簡單地運行一個不執行的查詢命令,並提供一個由分號分隔的所有sql字符串的連接字符串。

"INSERT INTO MY_TABLE VALUES(1,2,3,4)" + ";" +"UPDATE MY_TABLE, SET MY_VAL='1' WHERE MY_VAL IS NULL" + ";" +... 

您不需要在這種情況下準備聲明,也不會因此收到任何性能收益。