Java RMI - Ứng dụng cơ sở dữ liệu
Trong chương trước, chúng ta đã tạo một ứng dụng RMI mẫu trong đó máy khách gọi một phương thức hiển thị cửa sổ GUI (JavaFX).
Trong chương này, chúng ta sẽ lấy một ví dụ để xem cách một chương trình khách có thể truy xuất các bản ghi của một bảng trong cơ sở dữ liệu MySQL nằm trên máy chủ.
Giả sử chúng ta có một bảng tên student_data trong cơ sở dữ liệu details như hình bên dưới.
+----+--------+--------+------------+---------------------+
| ID | NAME | BRANCH | PERCENTAGE | EMAIL |
+----+--------+--------+------------+---------------------+
| 1 | Ram | IT | 85 | [email protected] |
| 2 | Rahim | EEE | 95 | [email protected] |
| 3 | Robert | ECE | 90 | [email protected] |
+----+--------+--------+------------+---------------------+
Giả sử tên của người dùng là myuser và mật khẩu của nó là password.
Tạo lớp học sinh viên
Tạo một Student lớp học với setter và getter như hình bên dưới.
public class Student implements java.io.Serializable {
private int id, percent;
private String name, branch, email;
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getBranch() {
return branch;
}
public int getPercent() {
return percent;
}
public String getEmail() {
return email;
}
public void setID(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setBranch(String branch) {
this.branch = branch;
}
public void setPercent(int percent) {
this.percent = percent;
}
public void setEmail(String email) {
this.email = email;
}
}
Xác định giao diện từ xa
Xác định giao diện từ xa. Ở đây, chúng tôi đang xác định một giao diện từ xa có tênHello với một phương pháp có tên getStudents ()trong đó. Phương thức này trả về một danh sách chứa đối tượng của lớpStudent.
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.*;
// Creating Remote interface for our application
public interface Hello extends Remote {
public List<Student> getStudents() throws Exception;
}
Phát triển lớp triển khai
Tạo một lớp và triển khai ở trên đã tạo interface.
Ở đây chúng tôi đang triển khai getStudents() phương pháp của Remote interface. Khi bạn gọi phương thức này, nó truy xuất các bản ghi của một bảng có tênstudent_data. Đặt các giá trị này cho lớp Student bằng cách sử dụng các phương thức setter của nó, thêm nó vào đối tượng danh sách và trả về danh sách đó.
import java.sql.*;
import java.util.*;
// Implementing the remote interface
public class ImplExample implements Hello {
// Implementing the interface method
public List<Student> getStudents() throws Exception {
List<Student> list = new ArrayList<Student>();
// JDBC driver name and database URL
String JDBC_DRIVER = "com.mysql.jdbc.Driver";
String DB_URL = "jdbc:mysql://localhost:3306/details";
// Database credentials
String USER = "myuser";
String PASS = "password";
Connection conn = null;
Statement stmt = null;
//Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
//Open a connection
System.out.println("Connecting to a selected database...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
System.out.println("Connected database successfully...");
//Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql = "SELECT * FROM student_data";
ResultSet rs = stmt.executeQuery(sql);
//Extract data from result set
while(rs.next()) {
// Retrieve by column name
int id = rs.getInt("id");
String name = rs.getString("name");
String branch = rs.getString("branch");
int percent = rs.getInt("percentage");
String email = rs.getString("email");
// Setting the values
Student student = new Student();
student.setID(id);
student.setName(name);
student.setBranch(branch);
student.setPercent(percent);
student.setEmail(email);
list.add(student);
}
rs.close();
return list;
}
}
Chương trình máy chủ
Một chương trình máy chủ RMI nên triển khai giao diện từ xa hoặc mở rộng lớp thực thi. Ở đây, chúng ta nên tạo một đối tượng từ xa và liên kết nó vớiRMI registry.
Sau đây là chương trình máy chủ của ứng dụng này. Ở đây, chúng tôi sẽ mở rộng lớp đã tạo ở trên, tạo một đối tượng từ xa và đăng ký nó vào sổ đăng ký RMI với tên liên kếthello.
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class Server extends ImplExample {
public Server() {}
public static void main(String args[]) {
try {
// Instantiating the implementation class
ImplExample obj = new ImplExample();
// Exporting the object of implementation class (
here we are exporting the remote object to the stub)
Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
// Binding the remote object (stub) in the registry
Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);
System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}
Chương trình khách hàng
Sau đây là chương trình khách hàng của ứng dụng này. Ở đây, chúng tôi đang tìm nạp đối tượng từ xa và gọi phương thức có têngetStudents(). Nó lấy các bản ghi của bảng từ đối tượng danh sách và hiển thị chúng.
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.*;
public class Client {
private Client() {}
public static void main(String[] args)throws Exception {
try {
// Getting the registry
Registry registry = LocateRegistry.getRegistry(null);
// Looking up the registry for the remote object
Hello stub = (Hello) registry.lookup("Hello");
// Calling the remote method using the obtained object
List<Student> list = (List)stub.getStudents();
for (Student s:list)v {
// System.out.println("bc "+s.getBranch());
System.out.println("ID: " + s.getId());
System.out.println("name: " + s.getName());
System.out.println("branch: " + s.getBranch());
System.out.println("percent: " + s.getPercent());
System.out.println("email: " + s.getEmail());
}
// System.out.println(list);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}
Các bước để chạy ví dụ
Sau đây là các bước để chạy Ví dụ RMI của chúng tôi.
Step 1 - Mở thư mục mà bạn đã lưu trữ tất cả các chương trình và biên dịch tất cả các tệp Java như hình dưới đây.
Javac *.java
Step 2 - Bắt đầu rmi đăng ký bằng cách sử dụng lệnh sau.
start rmiregistry
Điều này sẽ bắt đầu một rmi đăng ký trên một cửa sổ riêng biệt như hình dưới đây.
Step 3 - Chạy tệp lớp máy chủ như hình dưới đây.
Java Server
Step 4 - Chạy tệp lớp khách hàng như hình dưới đây.
java Client