2009-07-08 30 views
32

Trong nhiều ngôn ngữ lập trình như thế này là có thể cho chuẩn bị phát biểu:Sử dụng một biến thay vì một chỉ số tham số với một JDBC chuẩn bị tuyên bố

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ${name}"); 
statement.setString("name", "IBM"); 

Nhưng không phải với java.sql.PreparedStatement. Trong Java người ta phải sử dụng chỉ số tham số:

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ?"); 
statement.setString(1, "IBM"); 

Có giải pháp để làm việc với các biến chuỗi như trong ví dụ đầu tiên không? "$ {. *}" Không được sử dụng ở một nơi nào khác trong ngôn ngữ SQL hay có xung đột gì không? Nguyên nhân sau đó tôi sẽ thực hiện nó một mình (phân tích cú pháp chuỗi SQL và thay thế mọi biến bằng "?" Và sau đó thực hiện nó theo cách Java).

Kính trọng, Kai

+4

Nó bối rối cho tôi quá. http://www.javaworld.com/javaworld/jw-04-2007/jw-04-jdbc.html có nội dung tôi đã sử dụng nhiều lần. – akarnokd

+0

Hey kd304, tôi tự hỏi tại sao bạn không để lại tin nhắn của bạn như là câu trả lời thay vì sử dụng một bình luận. Vì tôi nghĩ đó là cách để tôi giải quyết vấn đề đó. – Zardoz

+0

@tokel: Tôi không chắc chắn về câu hỏi của bạn là lý thuyết hay không và nhận xét của tôi không thực sự trả lời câu hỏi đã nhập của bạn. – akarnokd

Trả lời

5

Sử dụng PreparedStatement liệu, điều này là không thể, như bạn nói. Có thể với CallableStatement, nhưng điều đó đòi hỏi một thủ tục được lưu trữ thay vì chỉ là một câu lệnh SQL.

Các lớp ORM như Hibernate cũng cung cấp thay thế tham số được đặt tên và Hibernate cũng cho phép bạn thực thi SQL nguyên gốc, bỏ qua hoàn toàn chức năng ánh xạ OR.

Vì vậy, nếu bạn thực sự muốn sử dụng các tham số có tên, bạn có thể sử dụng Hibernate như một cách để làm điều này; bạn chỉ sử dụng một phần nhỏ chức năng của nó.

+0

Hãy quên đi ý tưởng của tôi, @laz có ý tưởng tốt hơn nhiều. – skaffman

+0

Tôi nghĩ rằng trình điều khiển Oracle JDBC hỗ trợ gọi các câu lệnh SQL thông thường với các tham số có tên khi sử dụng CallableStatement, không chỉ cho các thủ tục. PostgreSQL nói "Chưa thực hiện" (postgresql-9.1-901.jdbc4.jar) – Oliv

+0

Thật buồn, vì DBMS hỗ trợ điều này, ít nhất SQL server, và JSBC intrnaly tạo các tham số có tên, như sau: '@ P0 nvarchar (4000), @ P1 varchar (8000), @ P2 nvarchar (4000), @ P3 smallint, @ P4 nvarchar (4000), @ P5 int' –

26

Báo cáo chuẩn bị JDBC chuẩn không có khả năng này. Spring JDBC cung cấp chức năng này thông qua NamedParameterJdbcTemplate.

+0

Cảm ơn vì giải pháp rất tốt. Vấn đề đối với tôi là nó sẽ là một phần của một khung nguồn mở khác và tôi không muốn nhập quá nhiều mã ở đó. Nếu không, tôi đã sử dụng giải pháp của bạn :-) – Zardoz

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