【IT168 技术】通过在JDBC中的论述,可以很容易地构架一个分布环境下的数据库应用模型。针对客户端远程调用对数据库操作的远程方法,具体实现途径可以采取多种策略。较好区别的两种手段分别是 "治标"或"治本"的。所谓"治标",是采取已有的JDBC的数据库的操作方法,将SQL语句的方法连接到该服务端的实现上,客户端发送SQL语句到服务进程,由服务进程进行查询,将结果包装为可以传递的远程对象返回给客户;而"治本"是指将JDBC API由本地方法重新定义为远程接口,然后给出所定义的JDBC API接口的所有实现,使之继承远程类,连接该类到服务程序指定的端口,客户端就可以仿照编写本地JDBC程序一样调用远程类的方法。处理数据查询的指令大多在客户端,这样的实现可以更活,相对也更简单(程序员可以不必要考虑数据的网络传输格式)。下面仅就第一种方式做一个简单的实例。
1)定义一个远程接口:
import java.rmi.Remote;
import java.rmi.*;
/*
Jdbc结合构架网络数据库
*/
public interface request extends Remote {
String getresult(String sql)throws RemoteException;
}
import java.rmi.*;
/*
Jdbc结合构架网络数据库
*/
public interface request extends Remote {
String getresult(String sql)throws RemoteException;
}
在该接口中,将返回的客户可操作的数据确定为String类对象,这其实是在服务端将记录对象经过转换成网络可以传输的格式,因为记录集是一逻辑视图,不可以被序列化,若想在客户端直接使用记录集对象,则就需要重新定义所有的JDBC API接口为远程方法接口,其中所有的方法都南需要重新定义。
2)实现上述远程接口的程序:
import java.rmi.server.UnicastRemoteObject;
import java.rmi.*;
import java.sql.*;
import java.net.*;
/*
实现远程接口的程序
*/
public class requestImpl extends UnicastRemoteObject
{
private String name;
private String queryresults;
public requestImpl(String s)throws RemoteException
{
super();
name=s;
queryresults="";
}
public String getresult(String sql)throws RemoteException
{
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
}
catch(Exception ex){
System.out.println("Can't find Databae driver class:"+ex);
return(null);
}
try{
String s="";
Connection con=DriverManager.getConnection("jdbc:odbc:example");
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery(sql);
int strlen=0;
while(rs.next()){
String sb="";
int i=rs.getInt("number");
String s1=rs.getString("name");
String s2=rs.getString("nation");
boolean b=rs.getBoolean("sex");
if(b==true)
sb="男";
else
sb="女";
Date d=rs.getDate("year");
String s3=rs.getString("address");
String s4=rs.getString("phone");
String text=i+" "s1" "s2""sb""d""s3""+s4;
s=s+text+"|";
}
queryresults=s;
stmt.close();
con.close();
}
catch(SQLException ex){
System.out.println("SQLException:"+ex);
}
return(queryresults);
}
}
import java.rmi.*;
import java.sql.*;
import java.net.*;
/*
实现远程接口的程序
*/
public class requestImpl extends UnicastRemoteObject
{
private String name;
private String queryresults;
public requestImpl(String s)throws RemoteException
{
super();
name=s;
queryresults="";
}
public String getresult(String sql)throws RemoteException
{
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
}
catch(Exception ex){
System.out.println("Can't find Databae driver class:"+ex);
return(null);
}
try{
String s="";
Connection con=DriverManager.getConnection("jdbc:odbc:example");
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery(sql);
int strlen=0;
while(rs.next()){
String sb="";
int i=rs.getInt("number");
String s1=rs.getString("name");
String s2=rs.getString("nation");
boolean b=rs.getBoolean("sex");
if(b==true)
sb="男";
else
sb="女";
Date d=rs.getDate("year");
String s3=rs.getString("address");
String s4=rs.getString("phone");
String text=i+" "s1" "s2""sb""d""s3""+s4;
s=s+text+"|";
}
queryresults=s;
stmt.close();
con.close();
}
catch(SQLException ex){
System.out.println("SQLException:"+ex);
}
return(queryresults);
}
}
3)服务程序:
import java.rmi.*;
public class server {
/**
服务程序
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.setSecurityManager(new RMISecurityManager());
try{
requestImpl obj=new requestImpl("server");
Naming.rebind("lxb", obj);
System.out.println("lxb created and bound");
}
catch(Exception e){
System.out.println("Error is:"+e);
}
}
}
public class server {
/**
服务程序
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.setSecurityManager(new RMISecurityManager());
try{
requestImpl obj=new requestImpl("server");
Naming.rebind("lxb", obj);
System.out.println("lxb created and bound");
}
catch(Exception e){
System.out.println("Error is:"+e);
}
}
}
4)客户端进行查询的小应用程序:
import java.applet.Applet;
import java.awt.*;
import java.rmi.*;
/*
客户端进行查询的小应用程序
*
*/
public class client extends Applet {
String rs="";
public void init(){
try{
request obj=(request)Naming.lookup("//202.119.199.118/lxb");
rs=obj.getresult("select * from student");
}
catch(Exception e){
System.out.println("Error is:"+e);
}
}
public void paint(Graphics g){
if(rs.equals("")){
g.drawString("无记录",5,50);
return;
}
g.drawString("学号 姓名 民族 性别 出生日期 籍贯 电话号码", 5,10);
int y=30;
int begin=0;
int end=rs.indexOf("|");
do{
String line=rs.substring(begin, end);
g.drawString(line, 5, y);
end=rs.indexOf("|", begin);
y=y+15;
}while(begin!=rs.length());
}
}
import java.awt.*;
import java.rmi.*;
/*
客户端进行查询的小应用程序
*
*/
public class client extends Applet {
String rs="";
public void init(){
try{
request obj=(request)Naming.lookup("//202.119.199.118/lxb");
rs=obj.getresult("select * from student");
}
catch(Exception e){
System.out.println("Error is:"+e);
}
}
public void paint(Graphics g){
if(rs.equals("")){
g.drawString("无记录",5,50);
return;
}
g.drawString("学号 姓名 民族 性别 出生日期 籍贯 电话号码", 5,10);
int y=30;
int begin=0;
int end=rs.indexOf("|");
do{
String line=rs.substring(begin, end);
g.drawString(line, 5, y);
end=rs.indexOf("|", begin);
y=y+15;
}while(begin!=rs.length());
}
}