2010-05-17 41 views
5

Làm thế nào bạn có thể thực hiện chèn hàng loạt bằng cách sử dụng Sql groovy trong khi mô phỏng các câu lệnh đã chuẩn bị? Tất cả các ví dụ tôi đã tìm thấy tương tự như sau và không sử dụng các câu lệnh đã chuẩn bị.Chèn hàng loạt bằng cách sử dụng Sql groovy?

withBatch { stmt -> 
stmt.addBatch("insert into table (field1,field2) values('value1','value2')") 
stmt.addBatch("insert into table (field1,field2) values('value3','value4')") 
} 

Theo liên kết này http://jira.codehaus.org/browse/GROOVY-3504 không có cách nào để sử dụng báo cáo được chuẩn bị trực tiếp từ trong lô. Cách tốt nhất để mô phỏng điều này vì vậy tôi có thể tránh phải viết mã của riêng tôi để tránh tiêm sql là gì?

Trả lời

0

Cũng liên quan là http://jira.codehaus.org/browse/GROOVY-4328.

Từ JIRA trên:

... là tốt nhất chúng ta có thể (đơn giản) làm là chuyển đổi một G-string này để đảm bảo Chuỗi bình thường. Để làm được điều đó, chúng tôi có thể thực hiện một ít hơn bit nhiều hơn chúng tôi hiện đang thực hiện bằng cách phân tích cú pháp chuỗi và cố gắng báo giá hoặc thoát "chuỗi" tìm kiếm nhưng không số hoặc ngày tìm kiếm nhưng có thể không rất thanh lịch. Thông thường, chúng tôi sẽ sử dụng "?" nhân vật placeholders và một tuyên bố chuẩn bị và sẽ có ít nhiều việc phải làm

Về mô phỏng chuẩn bị phát biểu, xem Java - escape string to prevent SQL injection

đó đang được nói, bạn có thể áp dụng để phân tích từ trên và trang trí withBatch phương pháp

16

Groovy 1.8.1 giới thiệu hỗ trợ cho các câu lệnh đã chuẩn bị với tính năng nhóm. Ví dụ đơn giản:

sql.withBatch(20, """update some_table 
         set some_column = :newvalue 
         where id = :key """) { ps ->     
      mymap.each { k,v -> 
       ps.addBatch(key:k, newvalue:v) 
      } 
} 

Cũng xem bài viết của tôi về chủ đề này: http://novyden.blogspot.com/2011/09/groovy-batch-prepared-statement-nice.html

+2

Cảm ơn mẹo! Để có được điều này để làm việc cho MySQL InnoDB, tôi đã phải thêm "sql.connection.autoCommit = false" trước khi withBatch, và "sql.connection.commit()" để làm cho nó dính. – Andrew

+0

Bạn sẽ làm như thế nào với nhiều cột? – AnujKu

0

OWASP ESAPI. https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API

Tùy chọn duy nhất của bạn khi báo cáo được chuẩn bị và lưu trữ procs KHÔNG PHẢI là một tùy chọn, là để tự thoát đầu vào của người dùng.

ESAPI đã làm việc, phương pháp tham khảo sản xuất sẵn sàng.

Codec ORACLE_CODEC = new OracleCodec(); 
String query = "SELECT user_id FROM user_data WHERE user_name = '" + 
    ESAPI.encoder().encodeForSQL(ORACLE_CODEC, req.getParameter("userID")) + "' and user_password = '" 
    + ESAPI.encoder().encodeForSQL(ORACLE_CODEC, req.getParameter("pwd")) +"'"; 

Nguồn: https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Databas

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