问题:

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. 走进安卓的重灾区----video

    html5的video已经出来很久了.在ios上使用基本上没什么毛病,但是安卓下就是一个重灾区了,各种体验差.这几天搞了安卓的兼容,简直是要吐血.所以特意总结了一些强势的坑点. 先看一下常用的一些属性 ...

  2. Android自动问题——黑屏、死机等解决方法

    今天用了下Android Studio,出现了一些问题,现在将启动过程中遇到的问题和解决方案列出来,方便大家参考. 安装过程不多说,网上一搜一大把. 那直接说问题吧: 1. 无法启动,报错:Faile ...

  3. EasyUI combobox 中文无法检索最终解决方案!

    写在前面: 因为之前一直用EasyUI的combobox控件,但是苦于在火狐浏览器下输入中文无法直接检索必须在输入完成后再敲击一下键盘才可以(按一下shift或空格),原因是中文输入法屏蔽了EasyU ...

  4. C语言指针2(空指针,野指针)

    //最近,有朋友开玩笑问 int *p  *是指针还是p是指针还是*p是指针,当然了,知道的都知道p是指针 //野指针----->>>指没有指向一个地址的指针(指针指向地址请参考上一 ...

  5. 一步一步学习Vue(十)

    本篇说一下组件通信的问题,父子组件通信,前面的博客中已有说明,vue也推荐props in,event out:兄弟节点通信如何做呢?官方其实也给出了实现方式,我们以下面的场景来实现一下: 上图中,实 ...

  6. elk 5.x的部署

    前言 elk是由elasticsearch.logstash.kibana三者组成 其中elasticsearch主要负责数据存储与搜索 logstash主要负责收集日志信息以及对日志信息的切片索引等 ...

  7. Java利用内存映射文件实现按行读取文件

    我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好 ...

  8. 用vector实现dijkstra

    #include <stdio.h> #include <string.h> #include <string> #include <vector> # ...

  9. HDU-2017-字符串统计

    /* Name: HDU-2017-字符串统计 Date: 18/04/17 20:19 Description: 水过 */ #include<bits/stdc++.h> using ...

  10. python学习===实现定时发送,方法一

    #比如每3秒打印一次helloworld:from threading import Timer def printHello(): print "Hello World" t = ...