Đây thực chất là một giao diện java - Đăng Nhập Xda77
Trong bài giới thiệu trước đây về Sharding-Jdbc, tôi đã gặp phải một vấn đề thú vị. Điều này cũng dẫn đến một chủ đề khá hấp dẫn khi tôi thực hiện truy vấn và mắc phải một lỗi khó phát hiện.
Ban đầu, tôi viết dòng code như sau:
1ResultSet resultSet = ps.executeQuery(sql);
Tuy nhiên, cách viết chính xác nên là:
1ResultSet resultSet = ps.executeQuery();
Sự khác biệt ở đây nằm ở việc có truyền tham số sql hay không. Trước tiên, chúng ta cần hiểu rõ ps là gì. Đây thực chất là một giao diện java.sql.PreparedStatement
, còn lớp triển khai thật sự là org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement
. Hãy cùng xem xét mối quan hệ kế thừa giữa các lớp.
Khi gọi phương thức executeQuery(final String sql)
, sẽ xảy ra một ngoại lệ như sau:
1@Override
2public final ResultSet executeQuery(final String sql) throws SQLException {
3 throw new SQLFeatureNotSupportedException("executeQuery with SQL for PreparedStatement");
4}
Lúc đầu, tôi khá bối rối khi gặp lỗi này. Sau khi kiểm tra kỹ hơn, tôi nhận ra rằng mình đang sử dụng câu lệnh cập nhật (update statement). Tôi nghĩ rằng có lẽ câu lệnh cập nhật không được hỗ trợ trong trường hợp này. Thông thường, tôi sử dụng MyBatis để thực hiện các thao tác cập nhật, nhưng lý thuyết cho thấy rằng điều này không đúng. Khi tìm hiểu thêm, tôi nhận ra rằng những ngoại lệ này được gói gọn bởi Sharding-Jdbc, cụ thể là lớp AbstractUnsupportedOperationPreparedStatement
.
Điều này phản ánh một tư duy thiết kế quan trọng. JDBC cung cấp một loạt các giao diện mà các nhà cung cấp có thể triển khai, chẳng hạn như MySQL, SQL Server, Oracle, v.v. Chính nhờ thiết kế này, Sharding-Jdbc cũng có thể xây dựng dựa trên nền tảng đó.
Hãy nhìn tổng quan về cơ sở triển khai của Sharding-Jdbc. Dựa vào mối quan hệ kế thừa của lớp ShardingSpherePreparedStatement
, chúng ta có thể suy ra rằng các lớp liên quan đều triển khai các giao diện cơ bản của JDBC.
Trong ví dụ demo, khi tạo kết nối:
1Connection conn = dataSource.getConnection();
Chúng ta thực tế đang nhận được đối tượng org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection
. Từ đó, khi chuẩn bị câu lệnh:
1PreparedStatement ps = conn.prepareStatement(sql);
Chúng ta nhận được đối tượng org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement
. Cuối cùng, khi thực thi:
1ResultSet resultSet = ps.executeQuery();
Chúng ta nhận được kết quả dưới dạng org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSet
.
Thực tế, các công cụ như MyBatis cũng hoạt động theo cách tương tự. Chúng sử dụng JDBC làm nền tảng để triển khai các chức năng phức tạp hơn. Điều này minh chứng cho sức mạnh và tính linh hoạt của trực tiếp bóng đá JDBC trong việc tích hợp với các công nghệ khác nhau.