Tùy chỉnh ResultSet

API JDBC hiện đại cho phép bạn tùy chỉnh nhiều đối tượng.Tuyên bốtập hợp kết quả. Ví dụ, sử dụngtập hợp kết quảbạn có thể thay đổi hàng trong cơ sở dữ liệu.

Khi tạo một đối tượng câu lệnh, chúng ta có thể chuyển một loạt các mong muốn của mình vào đó. Những mong muốn này có thể được chia thành ba nhóm:

  • Loại kết nối cơ sở
  • Kiểm soát truy cập đồng thời
  • Sự bền bỉ và giao dịch

Các tham số này có thể được truyền khi tạo một đối tượngTuyên bốhoặcChuẩn bịBáo cáo. Ví dụ:

Statement statement = connection.createStatement(
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT );

PreparedStatement statement = connection.prepareStatement(sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT);

Chúng tôi sẽ không nghiên cứu sâu những điều này, nhưng tôi muốn bạn biết rằng điều này có thể xảy ra nếu bạn bắt gặp điều gì đó tương tự trong mã của người khác.

Các loại ResultSet

ResultSet có thể thuộc một loại cụ thể. Loại xác định một số đặc điểm và khả năng của Bộ kết quả.

Không phải tất cả các loại đều được hỗ trợ bởi tất cả các cơ sở dữ liệu và trình điều khiển JDBC. Bạn sẽ phải kiểm tra cơ sở dữ liệu và trình điều khiển JDBC của mình để xem liệu nó có hỗ trợ loại bạn muốn sử dụng hay không. Phương thức DatabaseMetaData.supportsResultSetType(int type) trả về true hoặc false tùy thuộc vào việc loại đã cho có được hỗ trợ hay không.

Tại thời điểm viết bài này, có ba loại ResultSet:

  • Bộ kết quả.TYPE_FORWARD_ONLY
  • Bộ kết quả.TYPE_SCROLL_INSENSITIVE
  • Bộ kết quả.TYPE_SCROLL_SENSITIVE

Loại mặc định là TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY có nghĩa là Bộ kết quả chỉ có thể được di chuyển về phía trước. Nghĩa là, bạn chỉ có thể di chuyển từ hàng 1, hàng 2, hàng 3, v.v. Trong Tập kết quả, bạn không thể di chuyển lùi: bạn không thể đọc dữ liệu từ hàng thứ 9 sau khi đọc hàng thứ mười.

TYPE_SCROLL_INSENSITIVE có nghĩa là Tập kết quả có thể được di chuyển (cuộn) tiến hoặc lùi. Bạn cũng có thể di chuyển đến một vị trí tương đối so với vị trí hiện tại hoặc di chuyển đến một vị trí tuyệt đối.

Một Tập kết quả thuộc loại này không nhạy cảm với những thay đổi đối với nguồn dữ liệu cơ bản trong khi Tập kết quả đang mở. Nghĩa là, nếu một mục nhập trong Tập kết quả bị thay đổi trong cơ sở dữ liệu bởi một luồng hoặc quy trình khác, thì nó sẽ không được phản ánh trong tập tin đã mởtập hợp kết quảcủa loại này.

TYPE_SCROLL_SENSITIVE có nghĩa là Tập kết quả có thể được di chuyển (cuộn) tiến hoặc lùi. Bạn cũng có thể di chuyển đến một vị trí tương đối so với vị trí hiện tại hoặc di chuyển đến một vị trí tuyệt đối.

Một Tập kết quả thuộc loại này nhạy cảm với những thay đổi trong nguồn dữ liệu cơ sở khi Tập kết quả đang mở. Nghĩa là, nếu một mục nhập trong Tập kết quả bị thay đổi trong cơ sở dữ liệu bởi một luồng hoặc quy trình khác, thì nó sẽ được phản ánh trong tệp đã mởtập hợp kết quảcủa loại này.

đồng thời

Đồng thời của một Tập kết quả xác định xem Tập kết quả có thể được cập nhật hay chỉ đọc.

Một số cơ sở dữ liệu và trình điều khiển JDBC hỗ trợ cập nhật một Tập kết quả, nhưng không phải tất cả. Phương thức DatabaseMetaData.supportsResultSetConcurrency(int concurrency) trả về true hoặc false tùy thuộc vào việc chế độ tương tranh nhất định có được hỗ trợ hay không.

ResultSet có thể có một trong hai cấp độ đồng thời:

  • Bộ kết quả.CONCUR_READ_ONLY
  • Bộ kết quả.CONCUR_UPDATABLE

CONCUR_READ_ONLY có nghĩa là chỉ có thể đọc được Bộ kết quả.

CONCUR_UPDATABLE có nghĩa là Bộ kết quả có thể được đọc và sửa đổi.

Ví dụ về thay đổi dữ liệu trong cơ sở dữ liệu

Với các tham số này, bạn có thể kiểm soát Tuyên bố được tạo và Bộ kết quả của nó.

Ví dụ: bạn có thể tạo một Tập kết quả có thể cập nhật và sử dụng nó để thay đổi cơ sở dữ liệu. Khi tạo Tuyên bố, điều quan trọng là phải tuân thủ các điều kiện sau:

  • chỉ có một bảng được chỉ định
  • không chứa mệnh đề tham gia hoặc nhóm theo mệnh đề
  • cột truy vấn phải chứa khóa chính

Khi các điều kiện trên được đáp ứng, Bộ kết quả được cập nhật có thể được sử dụng để cập nhật một bảng trong cơ sở dữ liệu. Khi tạo một đối tượng Statement, bạn cần chỉ định các tham số sau:

Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)

Kết quả của việc thực hiện một câu lệnh như vậy là một tập kết quả có thể cập nhật. Phương pháp cập nhật là di chuyển con trỏ Bộ kết quả đến hàng bạn muốn cập nhật và sau đó gọi phương thức updateXXX() .

Phương thức updateXXX hoạt động tương tự như phương thức getXXX() . Phương thức updateXXX() có hai tham số. Đầu tiên là số cột được cập nhật, có thể là tên cột hoặc số sê-ri. Thứ hai là dữ liệu cần được cập nhật và loại dữ liệu này phải giống với XXX.

Để thực sự cập nhật hàng trong cơ sở dữ liệu, bạn cần gọi phương thức updateRow() trước khi con trỏ ResultSet rời khỏi hàng đã thay đổi, nếu không các thay đổi sẽ không được đưa vào cơ sở dữ liệu.

Bạn cũng có thể thêm hàng mới vào bảng:

Trước tiên, bạn cần di chuyển con trỏ đến một dòng trống. Để làm điều này, hãy gọi phương thức moveToInsertRow() .

Sau đó, bạn cần điền dữ liệu vào hàng này bằng phương thức updateXXX() .

Sau đó, bạn cần gọi phương thức inserterRow() để thêm hàng vào cơ sở dữ liệu.

Và cuối cùng, bạn cần trả lại con trỏ bằng cách gọi phương thức moveToCurrentRow() .

Quan trọng! Không phải tất cả các DBMS đều hỗ trợ các tùy chọn này cho Tuyên bố mở rộng. Trong trường hợp có vấn đề, hãy xem tài liệu chính thức của một DBMS cụ thể.