2010-06-22 32 views
6

Tôi cần phải chèn nhiều hàng vào cơ sở dữ liệu SQL Server (100 tại một thời điểm) từ mã Java của tôi. Tôi có thể làm cái này như thế nào? Hiện tại tôi đang chèn từng cái một và điều này trông không hiệu quả.Chèn nhiều hàng trong SQL Server từ Java

Trả lời

14

Bạn có thể sử dụng PreparedStatement#addBatch() để tạo một lô và executeBatch() để thực hiện.

Connection connection = null; 
PreparedStatement statement = null; 
try { 
    connection = database.getConnection(); 
    statement = connection.prepareStatement(SQL); 
    for (int i = 0; i < items.size(); i++) { 
     Item item = items.get(i); 
     statement.setString(1, item.getSomeValue()); 
     // ... 
     statement.addBatch(); 
     if ((i + 1) % 100 == 0) { 
      statement.executeBatch(); // Execute every 100 items. 
     } 
    } 
    statement.executeBatch(); 
} finally { 
    if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} 
    if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} 
} 

Xem thêm:

+0

trong phương pháp này nếu một bản ghi từ lô không thành công những gì sẽ xảy ra ..? sẽ các hồ sơ sau khi hồ sơ thất bại được chèn vào ... làm thế nào để tôi chắc chắn rằng ngoại trừ hồ sơ mà không tất cả các hồ sơ khác được chèn vào ...? – Kaddy

+1

Điều đó thực sự phụ thuộc vào trình điều khiển được sử dụng. Xem ['executeBatch()' javadoc] (http://java.sun.com/javase/6/docs/api/java/sql/Statement.html#executeBatch%28%29). – BalusC

2

Sử dụng hàng loạt.

Kiểm tra các addBatch(), executeBatch(), vv phương pháp của Java Statement

Đối với một ví dụ đơn giản, kiểm tra here (nhưng tôi sẽ đề nghị sử dụng một PreparedStatement)

+0

là có một tuyên bố hàng loạt trong máy chủ sql hoặc làm tôi cần phải sử dụng một api ...? – Kaddy

+0

@Kaddy - Tôi khuyên bạn nên làm điều đó ở phía Java với một lô sử dụng PreparedStatement – froadie

1

Bạn có thể vượt qua một trong rất chuỗi dài để SQL với nhiều chèn như một tuyên bố cho SQL Server. Tuy nhiên, điều này sẽ không hoạt động nếu bạn đang thực hiện truy vấn tham số. Và các chuỗi SQL được ghép nối là "Nói chung là một ý tưởng tồi".

Bạn có thể nên xem xét lệnh BULK INSERT. Nó có vấn đề là cứng nhắc về các đơn đặt hàng cột và như vậy. Nhưng nó nhanh chóng !!

+0

tôi không thể sử dụng điều này bởi vì tôi không có một tập tin ... cảm ơn anyways ... – Kaddy

+0

yeah, một PITA của nó để viết các tập tin và như vậy, nhưng đó là một mệnh lệnh tốt để nhận thức được. :) –

Các vấn đề liên quan