问题:

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

环境准备:

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

步骤:

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

package com.rmi;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import com.rmi.entity.Student; //编写DBmanager类,访问mysql数据库,实现创建表,录入成绩,查询成绩等操作。
public class DBManager {
private final static String userName = "root";
private final static String passWord = "root";
private final static String dburl = "jdbc:mysql://localhost:3306/rmiDB?useUnicode=true&characterEncoding=utf8";
private final static String driverClassName = "com.mysql.jdbc.Driver";
private static Connection conn = null;
private static ResultSet rs = null;
private static Statement stmt = null; public static Connection getConn() {
try {
Class.forName(driverClassName);
conn = DriverManager.getConnection(dburl, userName, passWord);
} catch (ClassNotFoundException e) {
System.out.println("没有找到数据库驱动程序");
} catch (SQLException e) {
System.out.println("数据库连接时出现异常,可能由于数据库服务未启动造成,请先启动数据库服务");
}
return conn;
} public static void createTable() {
String sql = "create table stu(stuNo varchar(10),stuName varchar(10),grade float);";
conn = getConn();
try {
stmt = conn.createStatement();
stmt.execute(sql);
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} public static void insert(Student stu) {
String sql = "insert into stu values('" + stu.getStuNo() + "','" + stu.getStuName() + "'," + stu.getGrade()
+ ")";
conn = getConn();
try {
stmt = conn.createStatement();
stmt.executeUpdate(sql);
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} public static Student getStu(String stuNo) {
String sql = "select * from stu where stuNo = " + stuNo;
conn = getConn();
Student stu = new Student();
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
stu.setStuNo(rs.getString(1));
stu.setStuName(rs.getString(2));
stu.setGrade(rs.getFloat(3));
}
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return stu;
} public static void main(String[] args) {
} }

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

package com.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException; import com.rmi.entity.Student; //提供创建表,录入成绩,查询成绩等操作(尽量与DBmanager类中的操作定义成同样的形式)。
public interface DBServer extends Remote {
public void createTable() throws RemoteException; public Student getStu(String stuNo) throws RemoteException; public void insert(Student stu) throws RemoteException;
}

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

package com.rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; import com.rmi.entity.Student; public class DBServerImpl extends UnicastRemoteObject implements DBServer { public DBServerImpl() throws RemoteException {
super();
} @Override
public void createTable() throws RemoteException {
DBManager.createTable();
} @Override
public Student getStu(String stuNo) throws RemoteException {
return DBManager.getStu(stuNo);
} @Override
public void insert(Student stu) throws RemoteException {
DBManager.insert(stu);
}
}

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

package com.rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry; //部署程序
public class DeployServer {
public DeployServer() {
} public static void main(String[] args) {
try {
DBServer ds=new DBServerImpl();
//LocateRegistry 用于获取特定主机(包括本地主机)上的远程对象注册表的引用,或用于创建一个接受对特定端口调用的远程对象注册表。
LocateRegistry.createRegistry(1111);// 创建并导出接受指定 port 请求的本地主机上的 Registry 实例。
//Naming 可以将某个名称作为一个参数,名称=url格式的字符串
Naming.rebind("//localhost:1111/ds", ds);// 将指定名称重新绑定到一个新的远程对象。
System.out.println("RMI服务器正在启动...");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} } }

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

package com.client;

import java.rmi.Naming;

import com.rmi.DBServer;
import com.rmi.entity.Student; public class RmiHelloClient {
public static void main(String[] args) {
try {
DBServer ds = (DBServer) Naming.lookup("//127.0.0.1:1111/ds");
ds.createTable();
Student stu = new Student();
stu.setStuNo("2014012771");
stu.setStuName("海哥哥");
stu.setGrade(99.9f);
ds.insert(stu);
Student stu2 = ds.getStu("2014012771");
System.out.println("学号: " + stu2.getStuNo());
System.out.println("姓名: " + stu2.getStuName());
System.out.println("成绩: " + stu2.getGrade());
} catch (Exception e) {
e.printStackTrace();
}
}
}

中间件学习之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. C# 创建、部署和调用WebService的简单示例

    废话不多说,下面开始创建一个简单的webservice的例子.这里我用的是Visual Studio 2015开发工具. 首先创建一个空的Web应用程序. 然后鼠标右键点击项目,选择 添加>新建 ...

  2. python有三种导入模块的方法(转)

    原文:http://www.cnblogs.com/allenblogs/archive/2011/11/15/2055149.html python有三种导入模块的方法 其一, import mod ...

  3. POJ2236 Wireless Network 并查集简单应用

    Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have ...

  4. Java面试容易容易出现的一些考点

    考点内容是我个人的一点看法,不代表一定是这些,后面会慢慢继续补充 请写出final.finally.finalize的区别 1.final和finally都是关键字.而finalize是一个方法,是属 ...

  5. Java学生成绩

    import java.util.*; public class guanlixiton { public static void main(String[] args) { Scanner in = ...

  6. 【模板】HDU--1233 畅通工程

      省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干 ...

  7. appach-maven-3.5.0配置与下载

    今天需要搭建javaweb开发的环境,需要配置maven.弄了半天终于配置好了.蛋疼的一批.楼主用的是win10的系统.不知道Linux下的也是不是这么坑! 首先,需要把maven的包下载下来.进入h ...

  8. HTML——CSS的基础语法1

    页面中所有CSS代码,需要写入到<style></style>标签中. style标签的type属性应该选择text/css,但是type属性可以省略. 1.CSS常用选择器 ...

  9. [bzoj4832]抵制克苏恩 概率dp

    考试的时候打了个搜索,时间比较短,样例又非常的弱,实在不太清楚他这个到底是什么意思. 不过lc大神好腻害,讲解了一下非常的清楚了. f[i][j][k][l]表示第i次伤害(啊),一滴血j个,两滴血k ...

  10. Loadrunner结果分析中连接图没有数据的设置

    场景进行中,或者之后进行结果分析中,连接图表没有数据,取消选择标记选项.