Các loại báo cáo
Chúng ta đã thấy giao diện Statement đơn giản nhất . Và mặc dù nó khá phù hợp cho công việc, nhưng nó không phù hợp lắm cho các truy vấn phức tạp. Trong một số nguồn, ý kiến được bày tỏ rằng không cần thiết phải sử dụng Tuyên bố - thay vào đó, các giao diện phức tạp hơn và giàu chức năng hơn sẽ phù hợp hơn.
- Chuẩn bịBáo cáo
- CallableStatement
Một câu hỏi khá hợp lý được đặt ra - tại sao lại cần những giao diện này? Hãy hình dung nó ra.
Đầu tiên, chúng ta sẽ xem qua giao diện PreparedStatement và các tính năng khác của JDBC. Chúng ta sẽ chuyển sang giao diện CallableStatement sau - thứ nhất, việc sử dụng nó không quá phổ biến và thứ hai, sau khi xem xét mọi thứ về nó, cuộc trò chuyện có thể đã khá ngắn.
Ngoài ra, PreparedStatement là một sự trợ giúp tuyệt vời từ cách tiếp cận phổ biến đối với việc hack cơ sở dữ liệu được gọi là SQL Injection.
Nhưng nhiều hơn về điều đó một lát sau.
Chuẩn bịBáo cáo
Nếu bạn cố gắng dịch tên PreparedStatement , bạn có thể nhận được một cái gì đó giống như "tuyên bố đã chuẩn bị". Từ quan trọng nhất ở đây là "chuẩn bị". "sẵn sàng" là gì?
Trước khi chúng tôi xem xét vấn đề này, tôi đề nghị xem xét một điểm khá quan trọng từ quan điểm thuận tiện, điều này xảy ra rất thường xuyên. Vì vậy, trong một số ứng dụng, chúng ta cần chèn dữ liệu liên hệ vào bảng LIÊN HỆ. Để làm điều này, chúng ta cần chuẩn bị một truy vấn như thế này:
INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (‘Harry’,'Potter','+79112345678','harry@example.com);
Thoạt nhìn, có vẻ như mọi thứ không quá khó khăn và đáng sợ. Chúng ta cần viết một mã sẽ thu thập chuỗi chúng ta cần từ các tham số: tên, họ, địa chỉ và số điện thoại. Bạn chỉ cần nhớ rằng tất cả dữ liệu chuỗi phải được bao quanh bởi một ký tự trích dẫn.
Nếu chúng ta làm điều này trong một chức năng riêng biệt, thì chúng ta sẽ nhận được một cái gì đó như thế này:
public String buildInsert(String firstName,, String lastName, String phone, String email) {
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) “+
”VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
return sql;
}
Chúng tôi chuyển tên, họ, số điện thoại và địa chỉ vào hàm tham số trong biểu mẫu và từ chúng, chúng tôi soạn một chuỗi truy vấn SQL. Trích dẫn làm hỏng hình ảnh một chút, nhưng cho đến nay nó không đáng sợ.
Ok, còn những con số thì sao? Họ không cần phải được bao quanh bởi dấu ngoặc kép. Vì vậy, trong một trường hợp bạn cần báo giá, trường hợp khác thì không. Tình hình ngày càng phức tạp.
Bây giờ, hãy thêm một vấn đề nữa - điều gì sẽ xảy ra nếu có một trích dẫn bình thường (và thậm chí không phải một) bên trong chuỗi? Trước tiên, bạn phải tìm những trích dẫn như vậy và xử lý chúng. Mdaaa. Bằng cách nào đó chúng ta bắt đầu cảm thấy khó chịu.
Nếu bây giờ chúng ta thêm xử lý ngày, thì nhiệm vụ sẽ trở nên hoàn toàn nhàm chán - bạn phải thực hiện một khối lượng công việc khổng lồ. Ngày nói chung là khó chịu - các máy chủ SQL khác nhau chấp nhận các định dạng ngày khác nhau.
Vậy chúng ta thấy gì? Nếu chúng ta cần sử dụng các tham số bên trong truy vấn, thì việc xây dựng truy vấn theo cách thủ công sẽ trở nên rất khó chịu. Và không chỉ khó chịu - tôi thậm chí có thể nói là nhàm chán. Có một số lượng lớn các trường hợp cần xem xét, và đây là một công việc cực kỳ nhàm chán. Về cơ bản, đối với những trường hợp như vậy, giao diện PreparedStatement đã được đề xuất .
Yêu cầu này cho phép bạn thực hiện hai việc:
- Chuẩn bị trước một yêu cầu chỉ ra những nơi mà các tham số sẽ được thay thế
- Đặt tham số của một loại nhất định rồi thực hiện truy vấn với tham số đã được đặt
Ví dụ về PreparedStatement
Cấu trúc của PreparedStatement cho tùy chọn cài đặt tham số của chúng ta sẽ như sau:
// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";
// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";
// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);
// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);
// Execute the request
stmt.executeUpdate();
Như bạn có thể thấy, mọi thứ khá đơn giản.
Đầu tiên, khi viết một truy vấn SQL, những nơi cần thay thế các tham số được viết bằng dấu chấm hỏi - “?”.
Thứ hai, yêu cầu được tạo bằng cách gọi con.prepareStatement() .
Thứ ba, việc cài đặt các tham số thông qua chỉ báo về số lượng và giá trị. Xin lưu ý rằng số lượng tham số bắt đầu từ 1, không phải từ 0, như chúng ta đã quen khi làm việc với mảng và tập hợp.
Giao diện PreparedStatement chứa các phương thức để đặt chuỗi — setString() , để đặt số — setInt() , setLong() , setDouble() , để đặt ngày — setDate() . Và các loại phức tạp hơn - điều này có thể được nhìn thấy trong tài liệu.
Thứ tư, lệnh gọi đến stmt.executeUpdate() đã được thực hiện mà không chỉ định chuỗi truy vấn.
Tôi thực sự khuyên bạn nên kết bạn với PreparedStatement - đây là một công cụ rất hiệu quả.
GO TO FULL VERSION