• 中间件学习之RMI+JDBC远端数据库的访问


    问题:

    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();
    		}
    	}
    }
  • 相关阅读:
    MVC Areas的使用
    每日踩坑 2019-07-30 H5 使用 iframe 底部有白边
    C# 使用 MsieJavaScriptEngine 引擎运行JavaScript
    Javascript获取value值的三种方法及注意点
    java编程(2)——servlet和Ajax异步请求的接口编程(有调用数据库的数据)
    java编程(1)——servlet和Ajax异步请求的接口编程(没有调用数据库的数据)
    eclipse的常用设置
    Junit4单元测试
    Java异常
    Java的抽象类和接口
  • 原文地址:https://www.cnblogs.com/jasonhaven/p/7355048.html
Copyright © 2020-2023  润新知