Java RMI - Aplicativo de banco de dados
No capítulo anterior, criamos um aplicativo RMI de amostra em que um cliente invoca um método que exibe uma janela GUI (JavaFX).
Neste capítulo, daremos um exemplo para ver como um programa cliente pode recuperar os registros de uma tabela no banco de dados MySQL residente no servidor.
Suponha que temos uma mesa chamada student_data no banco de dados details como mostrado abaixo.
+----+--------+--------+------------+---------------------+
| ID | NAME | BRANCH | PERCENTAGE | EMAIL |
+----+--------+--------+------------+---------------------+
| 1 | Ram | IT | 85 | [email protected] |
| 2 | Rahim | EEE | 95 | [email protected] |
| 3 | Robert | ECE | 90 | [email protected] |
+----+--------+--------+------------+---------------------+
Suponha que o nome do usuário seja myuser e sua senha é password.
Criando uma classe de aluno
Criar uma Student aula com setter e getter métodos como mostrado abaixo.
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;
}
}
Definindo a Interface Remota
Defina a interface remota. Aqui, estamos definindo uma interface remota chamadaHello com um método chamado getStudents ()iniciar. Este método retorna uma lista que contém o objeto da classeStudent.
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;
}
Desenvolvendo a Classe de Implementação
Crie uma classe e implemente o criado acima interface.
Aqui estamos implementando o getStudents() método do Remote interface. Quando você invoca este método, ele recupera os registros de uma tabela chamadastudent_data. Define esses valores para a classe Student usando seus métodos setter, adiciona-os a um objeto de lista e retorna essa lista.
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;
}
}
Programa de Servidor
Um programa de servidor RMI deve implementar a interface remota ou estender a classe de implementação. Aqui, devemos criar um objeto remoto e vinculá-lo aoRMI registry.
A seguir está o programa do servidor deste aplicativo. Aqui, vamos estender a classe criada acima, criar um objeto remoto e registrá-lo no registro RMI com o nome de ligaçãohello.
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();
}
}
}
Programa Cliente
A seguir está o programa cliente deste aplicativo. Aqui, estamos buscando o objeto remoto e invocando o método chamadogetStudents(). Ele recupera os registros da tabela do objeto de lista e os exibe.
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();
}
}
}
Etapas para executar o exemplo
A seguir estão as etapas para executar nosso Exemplo de RMI.
Step 1 - Abra a pasta onde você armazenou todos os programas e compile todos os arquivos Java como mostrado abaixo.
Javac *.java
Step 2 - Comece o rmi registro usando o seguinte comando.
start rmiregistry
Isso vai começar um rmi registro em uma janela separada, conforme mostrado abaixo.
Step 3 - Execute o arquivo de classe do servidor conforme mostrado abaixo.
Java Server
Step 4 - Execute o arquivo de classe do cliente conforme mostrado abaixo.
java Client