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 settergetter 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