Java RMI数据库应用程序

在上一章中,我们创建了一个RMI图形用户界面应用程序的示例,客户端调用服务器端显示GUI窗口(JavaFX)的方法。

在本章中,我们将以一个例子来看看客户端程序如何检索位于服务器上的MySQL数据库中的表的记录。

假设在数据库:testdb中有一个名称为student的表,其表结构和数据如下所示 -

+----+--------+--------+------------+---------------------+ 
| ID | NAME   | BRANCH | PERCENTAGE | EMAIL               | 
+----+--------+--------+------------+---------------------+ 
|  1 | Maxsu    | IT     |         85 | maxsu@yiibai.com    | 
|  2 | Curry  | EEE    |         95 | curry123@gmail.com  | 
|  3 | Alex | ECE    |         90 | alexs130@gmail.com | 
+----+--------+--------+------------+---------------------+

SQL

创建数据库和表如下语句 -

CREATE DATABASE IF NOT EXISTS testdb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

use testdb;

-- ----------------------------
-- Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL DEFAULT '',
  `branch` varchar(16) NOT NULL DEFAULT '',
  `percentage` float unsigned DEFAULT '0',
  `email` varchar(48) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', 'Maxsu', 'IT', '85', 'maxsu@yiibai.com');
INSERT INTO `student` VALUES ('2', 'Curry', 'EEE', '96', 'curry123@gmail.com');
INSERT INTO `student` VALUES ('3', 'Alex', 'ECE', '92', 'alexs130@gmail.com');

SQL

假设所使用的MySQL服务器的用户名是:root,其密码是:123456

创建 Student 类

创建一个Student类,并创建settergetter方法,创建一个Java源代码文件:Student.java,如下所示。

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; 
   } 
}

Java

定义远程接口

在这里,我们定义一个名为Hello的远程接口,Hello接口中有一个getStudents()方法。此方法返回一个包含Student类对象的列表。

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;  
}

Java

开发实现类

创建一个类并实现上面创建的Hello远程接口。

这里我们实现远程接口的getStudents()方法。当调用此方法时,它将检索数据库:students表中的记录。使用Student类的setter方法设置对象的值并返回该对象列表。创建一个JAVA源文件:ImplExample.java 如下所示 -

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/testdb";  

      // Database credentials 
      String USER = "root"; 
      String PASS = "123456";  

      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;     
   }  
}

Java

服务器程序

RMI服务器程序应实现远程接口或扩展实现类。 在这里,我们将创建一个远程对象并将其绑定到RMI注册表。

以下是本应用程序的服务器程序。 在这里,我们将扩展上述创建的类,创建一个远程对象并使用绑定名称为:hello ,将其注册到RMI注册表。创建一个JAVA源文件:Server.java 如下所示 -

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(); 
      } 
   } 
}

Java

客户端程序

以下是本应用程序的客户端程序。 在这里,我们获取远程对象并调用getStudents()方法。它从列表对象中检索表 - student的行记录并显示它们。创建一个JAVA源文件:Client.java 如下所示 -

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(); 
      } 
   } 
}

Java

运行示例的步骤

以下是运行RMI示例的步骤。

注意:如果手动编译,需要把上面代码存放到目录:F:\worksp\java_rmi\java-dbapp中,并创建一个目录:F:\worksp\java_rmi\java-dbapp\libs,把下载的 mysql-connector-java-5.1.40-bin.jar 库(下载地址:MySQL :: Download MySQL Connector/J (Archived Versions) )放入到 F:\worksp\java_rmi\java-dbapp\libs 目录中。

第一步 - 打开存储所有程序的文件夹,并编译所有Java文件,如下所示。

F:\worksp\java_rmi\java-dbapp> javac -Djava.ext.dirs=F:\worksp\java_rmi\java-dbapp\libs *.java

Shell

第二步 - 使用以下命令启动rmi注册表。

F:\worksp\java_rmi\java-dbapp> start rmiregistry

Shell

执行上面命令后,将在单独的窗口中启动一个rmi注册表。

第三步 - 运行服务器类代码,如下所示。

F:\worksp\java_rmi\java-dbapp>java -Djava.ext.dirs=F:\worksp\java_rmi\java-dbapp\libs Server
Server ready

Shell

第三步 - 运行客户端类文件,如下所示。

F:\worksp\java_rmi\java-dbapp>java -Djava.ext.dirs=F:\worksp\java_rmi\java-dbapp\libs Client

Shell

执行上面命令后,输出结果如下 -

F:\worksp\java_rmi\java-dbapp>java -Djava.ext.dirs=F:\worksp\java_rmi\java-dbapp\libs Client
ID: 1
name: Maxsu
branch: IT
percent: 85
email: maxsu@yiibai.com
ID: 2
name: Curry
branch: EEE
percent: 96
email: curry123@gmail.com
ID: 3
name: Alex
branch: ECE
percent: 92
email: alexs130@gmail.com

F:\worksp\java_rmi\java-dbapp>

Java RMI(远程方法调用)是Java语言中的一项技术,可以让分散在不同计算机上的程序之间进行远程通信。Java RMI使用Java的序列化机制来传递消息和参数,并通过Java虚拟机(JVM)来实现对远程对象的调用。对于数据库应用而言,Java RMI可以通过网络将客户端与服务器连接起来,并提供一种基于Java的分布式数据库交互方式。 使用Java RMI来连接数据库,可以使得客户端和服务器端的计算机分别处于不同的地点,甚至可以位于不同的城市、不同的国家或不同的大洲。这种分布式的架构使得客户端在终端上只需要安装少量的软件,并且大部分工作都由服务器端完成。同时,Java RMI提供了良好的安全性和稳定性,可以保证数据的安全性和完整性。 对于Java RMI连接数据库的实现,需要涉及到几个方面的知识点。首先是Java的JDBC技术,通过JDBC可以实现对于数据库的访问操作。其次是Java RMI的远程调用机制,需要实现远程对象(Remote Object)的创建。在客户端和服务器端之间建立连接后,客户端可以通过远程对象来调用服务器端提供的操作,并将数据从客户端传递到服务器端进行处理。 总的来说,Java RMI 数据库架构的实现可以为企业提供便捷的分布式数据库操作服务,提高数据安全性和稳定性,并且可以支持异构系统之间的数据共享和集成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧浩海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值