问题:

RMI+JDBC远端数据库的访问。实现简单的成绩查询系统(创建表,录入成绩,查询成绩等)。在服务器端,通过JDBC访问数据库。客户端调用服务端提供的各种数据库操作。

环境准备:

(1).确保JDK已经安装,并将其bin路径配置到环境变量path中 
(2).创建MySQL数据库,数据库名为rmidb 

步骤:

(1)使用mysql-connector-java-5[1].0.8.zip驱动包,编写DBManager类,访问mysql数据库,实现创建表,录入成绩,查询成绩等操作。

  1. package com.rmi;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.sql.Statement;
  8.  
  9. import com.rmi.entity.Student;
  10.  
  11. //编写DBmanager类,访问mysql数据库,实现创建表,录入成绩,查询成绩等操作。
  12. public class DBManager {
  13. private final static String userName = "root";
  14. private final static String passWord = "root";
  15. private final static String dburl = "jdbc:mysql://localhost:3306/rmiDB?useUnicode=true&characterEncoding=utf8";
  16. private final static String driverClassName = "com.mysql.jdbc.Driver";
  17. private static Connection conn = null;
  18. private static ResultSet rs = null;
  19. private static Statement stmt = null;
  20.  
  21. public static Connection getConn() {
  22. try {
  23. Class.forName(driverClassName);
  24. conn = DriverManager.getConnection(dburl, userName, passWord);
  25. } catch (ClassNotFoundException e) {
  26. System.out.println("没有找到数据库驱动程序");
  27. } catch (SQLException e) {
  28. System.out.println("数据库连接时出现异常,可能由于数据库服务未启动造成,请先启动数据库服务");
  29. }
  30. return conn;
  31. }
  32.  
  33. public static void createTable() {
  34. String sql = "create table stu(stuNo varchar(10),stuName varchar(10),grade float);";
  35. conn = getConn();
  36. try {
  37. stmt = conn.createStatement();
  38. stmt.execute(sql);
  39. stmt.close();
  40. conn.close();
  41. } catch (SQLException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45.  
  46. public static void insert(Student stu) {
  47. String sql = "insert into stu values('" + stu.getStuNo() + "','" + stu.getStuName() + "'," + stu.getGrade()
  48. + ")";
  49. conn = getConn();
  50. try {
  51. stmt = conn.createStatement();
  52. stmt.executeUpdate(sql);
  53. stmt.close();
  54. conn.close();
  55. } catch (SQLException e) {
  56. e.printStackTrace();
  57. }
  58. }
  59.  
  60. public static Student getStu(String stuNo) {
  61. String sql = "select * from stu where stuNo = " + stuNo;
  62. conn = getConn();
  63. Student stu = new Student();
  64. try {
  65. stmt = conn.createStatement();
  66. rs = stmt.executeQuery(sql);
  67. if (rs.next()) {
  68. stu.setStuNo(rs.getString(1));
  69. stu.setStuName(rs.getString(2));
  70. stu.setGrade(rs.getFloat(3));
  71. }
  72. stmt.close();
  73. conn.close();
  74. } catch (SQLException e) {
  75. e.printStackTrace();
  76. }
  77. return stu;
  78. }
  79.  
  80. public static void main(String[] args) {
  81. }
  82.  
  83. }

(2)定义服务接口DBServer,参考实例DBServer.java。提供创建表,录入成绩,查询成绩等操作(尽量与DBmanager类中的操作定义成同样的形式)。

  1. package com.rmi;
  2.  
  3. import java.rmi.Remote;
  4. import java.rmi.RemoteException;
  5.  
  6. import com.rmi.entity.Student;
  7.  
  8. //提供创建表,录入成绩,查询成绩等操作(尽量与DBmanager类中的操作定义成同样的形式)。
  9. public interface DBServer extends Remote {
  10. public void createTable() throws RemoteException;
  11.  
  12. public Student getStu(String stuNo) throws RemoteException;
  13.  
  14. public void insert(Student stu) throws RemoteException;
  15. }

(3)实现服务,请参考RMI实例DBServerImpl。对实现创建表,录入成绩,查询成绩等操作。实现过程中可直接使用DBmanager类。

  1. package com.rmi;
  2.  
  3. import java.rmi.RemoteException;
  4. import java.rmi.server.UnicastRemoteObject;
  5.  
  6. import com.rmi.entity.Student;
  7.  
  8. public class DBServerImpl extends UnicastRemoteObject implements DBServer {
  9.  
  10. public DBServerImpl() throws RemoteException {
  11. super();
  12. }
  13.  
  14. @Override
  15. public void createTable() throws RemoteException {
  16. DBManager.createTable();
  17. }
  18.  
  19. @Override
  20. public Student getStu(String stuNo) throws RemoteException {
  21. return DBManager.getStu(stuNo);
  22. }
  23.  
  24. @Override
  25. public void insert(Student stu) throws RemoteException {
  26. DBManager.insert(stu);
  27. }
  28. }

(4)编写部署类DeployServer,请参考RMI实例DeployServer.java。

  1. package com.rmi;
  2.  
  3. import java.net.MalformedURLException;
  4. import java.rmi.Naming;
  5. import java.rmi.RemoteException;
  6. import java.rmi.registry.LocateRegistry;
  7.  
  8. //部署程序
  9. public class DeployServer {
  10. public DeployServer() {
  11. }
  12.  
  13. public static void main(String[] args) {
  14. try {
  15. DBServer ds=new DBServerImpl();
  16. //LocateRegistry 用于获取特定主机(包括本地主机)上的远程对象注册表的引用,或用于创建一个接受对特定端口调用的远程对象注册表。
  17. LocateRegistry.createRegistry(1111);// 创建并导出接受指定 port 请求的本地主机上的 Registry 实例。
  18. //Naming 可以将某个名称作为一个参数,名称=url格式的字符串
  19. Naming.rebind("//localhost:1111/ds", ds);// 将指定名称重新绑定到一个新的远程对象。
  20. System.out.println("RMI服务器正在启动...");
  21. } catch (RemoteException e) {
  22. e.printStackTrace();
  23. } catch (MalformedURLException e) {
  24. e.printStackTrace();
  25. }
  26.  
  27. }
  28.  
  29. }

(5)使用DataService接口,实现客户端,请参考RMI实例RmiHelloClient.java。编写bat文件启动服务器和客户端,进行测试。

  1. package com.client;
  2.  
  3. import java.rmi.Naming;
  4.  
  5. import com.rmi.DBServer;
  6. import com.rmi.entity.Student;
  7.  
  8. public class RmiHelloClient {
  9. public static void main(String[] args) {
  10. try {
  11. DBServer ds = (DBServer) Naming.lookup("//127.0.0.1:1111/ds");
  12. ds.createTable();
  13. Student stu = new Student();
  14. stu.setStuNo("2014012771");
  15. stu.setStuName("海哥哥");
  16. stu.setGrade(99.9f);
  17. ds.insert(stu);
  18. Student stu2 = ds.getStu("2014012771");
  19. System.out.println("学号: " + stu2.getStuNo());
  20. System.out.println("姓名: " + stu2.getStuName());
  21. System.out.println("成绩: " + stu2.getGrade());
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }

中间件学习之RMI+JDBC远端数据库的访问的更多相关文章

  1. 前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误。    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected est

    前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误. Caused by: ...

  2. JDBC操作数据库的学习(2)

    在上一篇博客<JDBC操作数据库的学习(1)>中通过对例1,我们已经学习了一个Java应用如何在程序中通过JDBC操作数据库的步骤流程,当然我们也说过这样的例子是无法在实际开发中使用的,本 ...

  3. JDBC操作数据库的学习(1)

    单单对数据库的操作,比如说MySQL,我们可以在命令行窗口中执行,但是一般是应用程序要操作数据库,因此我们应该在程序中的代码上体现对数据库的操作,那么使用程序应用如何操作数据库呢?那就要使用到数据库的 ...

  4. springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务

    springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...

  5. javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD

    一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的exe ...

  6. JavaWeb学习总结-09 JDBC 学习和使用

    一 JDBC相关概念介绍 1.1 数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

  7. 通过jdbc获取数据库中的表结构

    通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类   1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.Met ...

  8. JDBC学习笔记(1)——JDBC概述

    JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...

  9. 使用JDBC进行数据库的事务操作(2)

    本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...

随机推荐

  1. NLP —— 图模型(一)隐马尔可夫模型(Hidden Markov model,HMM)

    本文简单整理了以下内容: (一)贝叶斯网(Bayesian networks,有向图模型)简单回顾 (二)隐马尔可夫模型(Hidden Markov model,HMM) 写着写着还是写成了很规整的样 ...

  2. 懵懂oracle之存储过程3--JOB详解

    在前面学习了存储过程的开发.调试之后,我们现在就需要来使用存储过程了.简单的使用,像上篇<懵懂oracle之存储过程2>中提到的存储过程调用,我们可以将写好的存储过程在另一个PL/SQL块 ...

  3. goroutine 加 channel 代替递归调用,突破递归调用的层级限制

    package main import ( "fmt" "github.com/davecgh/go-spew/spew" "github.com/B ...

  4. Social Network Analysis的Centrality总结,以及networkx实现EigenCentrality,PageRank和KatzCentrality的对比

    本文主要总结近期学习的Social Network Analysis(SNA)中的各种Centrality度量,我暂且翻译为中心度.本文主要是实战,理论方面几乎没有,因为对于庞大的SNA,我可能连门都 ...

  5. hdu 6059---Kanade's trio(字典树)

    题目链接 Problem Description Give you an array A[1..n],you need to calculate how many tuples (i,j,k) sat ...

  6. TCP 滑动窗口

    滑动窗口协议 流量控制方法 PUSH 慢启动   隔一个报文段确认"的策略实际就是因为 delayed ack,同时接收到两个待确认的ACK包时,就立即发送确认包.   滑动窗口实例   解 ...

  7. 庖丁解牛——CY7C68013A开发框架

    大家好,好久不见了,距离上次发文章都有两个多星期了,非常高兴同时也非常感谢你们能一直关注我.之前在公众号上收到网友的消息,其大概意思就是问我能不能出点USB干货,为此我就把第二篇--解密USB2.0数 ...

  8. C互质个数

    C互质个数 Time Limit:1000MS  Memory Limit:65536K Total Submit:55 Accepted:27 Description 贝贝.妞妞和康康都长大了,如今 ...

  9. request.getParameter()与request.setAttribute()的区别 (转载)

    request.getParameter()与request.setAttribute()的区别 request.getParameter(),request.setAttribute()区别如下: ...

  10. 66. Plus One【leetcode】

    Given a non-negative integer represented as a non-empty array of digits, plus one to the integer. Yo ...