Để truy xuất dữ liệu từ cơ sở dữ liệu đồ thị Neo4j vào ứng dụng backend Java, cách tiếp cận phổ biến là sử dụng trình điều khiển JDBC của Neo4j. Dưới đây là hướng dẫn chi tiết về cách thiết lập kết nối, thực thi truy vấn và xử lý tài nguyên một cách an toàn.
Thiết lập dự án với Maven
Thay vì thêm thủ công các file JAR, nên sử dụng Maven để quản lý phụ thuộc. Thêm đoạn khai báo sau vào tập tin pom.xml:
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-jdbc-driver</artifactId>
<version>{phiên-bản-tương-ứng}</version>
</dependency>
Sau khi khai báo, Maven sẽ tự động tải và cấu hình trình điều khiển JDBC cho Neo4j, giúp quá trình phát triển trở nên đơn giản và dễ bảo trì hơn.
Ví dụ kết nối và truy vấn dữ liệu
Dưới đây là ví dụ minh họa cách kết nối tới Neo4j và thực hiện một truy vấn đơn giản để lấy dữ liệu:
package jdbc_neo4j_test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Neo4jConnector {
public static void main(String[] args) {
System.out.println("Khởi động ứng dụng...");
String url = "jdbc:neo4j://<địa-chỉ-ip>";
String username = "<tên-người-dùng>";
String password = "<mật-khẩu>";
try (Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement()) {
ResultSet resultSet = statement.executeQuery("MATCH (n) RETURN n LIMIT 25");
while (resultSet.next()) {
System.out.println(resultSet.getString("n"));
}
} catch (SQLException e) {
System.err.println("Lỗi khi truy vấn cơ sở dữ liệu: " + e.getMessage());
e.printStackTrace();
}
}
}
Giải thích cú pháp try-with-resources
Cú pháp try (Resource resource = new Resource()) được gọi là try-with-resources, cho phép tự động giải phóng tài nguyên sau khi khối lệnh thực thi xong. Bất kỳ đối tượng nào triển khai giao diện AutoCloseable (như Connection, Statement, ResultSet) đều có thể được sử dụng ở đây. Điều này giúp tránh rò rỉ tài nguyên và loại bỏ nhu cầu gọi .close() thủ công.
Các bước cơ bản khi làm việc với JDBC
- Tải trình điều khiển (driver) phù hợp với cơ sở dữ liệu.
- Tạo kết nối đến cơ sở dữ liệu thông qua URL, tên đăng nhập và mật khẩu.
- Tạo đối tượng
StatementhoặcPreparedStatementđể thực thi câu lệnh SQL. - Thực thi truy vấn và xử lý kết quả trả về bằng
ResultSet. - Tự động dọn dẹp tài nguyên bằng khối
try-with-resources.
Phân biệt các loại Statement trong JDBC
Trong JDBC, có ba loại đối tượng dùng để thực thi truy vấn:
- Statement: Dùng để thực thi các câu lệnh SQL không tham số. Phù hợp với truy vấn đơn giản, ít thay đổi.
- PreparedStatement: Kế thừa từ
Statement, hỗ trợ truy vấn có tham số đầu vào (IN parameters), giúp chống tấn công SQL Injection và tăng hiệu năng nhờ biên dịch trước. - CallableStatement: Kế thừa từ
PreparedStatement, dùng để gọi các stored procedure trong cơ sở dữ liệu, hỗ trợ cả tham số ra (OUT parameters).
Xử lý lỗi liên quan đến lớp lồng nhau (nested class)
Lỗi No enclosing instance of type Main is accessible... thường xảy ra khi cố gắng truy cập một lớp lồng bên trong từ phương thức static như main. Do phương thức main là tĩnh, nó không thể trực tiếp khởi tạo lớp nội bộ không tĩnh.
Để khắc phục, có hai cách:
- Cách 1: Khai báo lớp nội bộ là
static. Ví dụ:static class Dog { ... }. - Cách 2: Di chuyển lớp
Dogra ngoài lớp chứa (ví dụMain), thành một lớp độc lập.
Việc này đảm bảo rằng lớp có thể được khởi tạo mà không cần một thể hiện của lớp bao bọc.