Java不走弯路教程(5.Client-Server模式(2)-Client)

5.Client-Server模式(2)-Client
在上一章,我们完成一个简单的数据库服务器,并在客户端用telnet方式成功进行通信。
本章将用Java实现客户端程序,来代替telnet。

先看代码

Java不走弯路教程(5.Client-Server模式(2)-Client)

Java不走弯路教程(5.Client-Server模式(2)-Client)

Java不走弯路教程(5.Client-Server模式(2)-Client)

Java不走弯路教程(5.Client-Server模式(2)-Client)

下面是客户端与服务器的协议:

建立连接
服务器 发送:Input your name password:
客户端 发送:用户名空格密码
服务器 发送:verify ok
客户端 发送:SQL语句
服务器 发送:查询结果
客户端 发送:exit
断开连接

这样我们模拟了一个简单的数据库服务器和客户端的交互过程。
算作我们的数据库产品,我称他为MyDB

这样提供给用户使用,很不方便,因为用户要了解我的协议,才可以使用。
而用户需要的只是数据库的地址,端口,用户名,密码。
然后发送SQL语句,返回查询结果。这些简单的需求。

Java不走弯路教程(5.Client-Server模式(2)-Client)

注:我们抛掉了MyUtil。

我把通讯过程封装到下面的三个类中
Driver 用于连接服务器的驱动程序,返回一个Connection对象
Connection 控制连接的建立与关闭,创建SQL语句执行对象
Statement SQL语句执行对象,发送SQL语句,返回查询结果
ResultSet 查询结果

上述类的关系可以表示如下:
Driver->产生Connection->产生Statement->产生ResultSet

Driver相当于数据库的驱动程序,按照通用的软件逻辑来看,软件使用前,需要安装驱动程序并将驱动程序注册到操作系统。这样下次就可以直接使用软件了。
所以我们需要一个安装驱动的过程。

接下来我们对这条语句进行改造:
MyConnection conn = MyDriver.connect("127.0.0.1",8000,"root","abc");

//安装驱动程序
MyDriver myDriver = new MyDriver();
myDriver.install();
//注册驱动程序
myDriver.regist();

MyConnection conn1 = myDriver.connect("127.0.0.1",8000,"root","abc");
MyConnection conn2 = myDriver.connect("127.0.0.1",8000,"root","abc");

这样在安装并注册完驱动程序后,我们就可以从获得数据库连接开始操作数据库了。

如果conn1和conn2不在同一方法/类中,我们需要把myDriver传来到使用他的方法/类中,才能获得数据库连接。
显然这不是我们想要的。
我们需要的理想方式是,一次安装注册,到处使用。

不依赖于具体的实例的话,我们需要用静态方法来实现,因为静态方法在程序运行期间不依赖于具体的实例,
所以我们做一个MyDriverManager,把安装好的驱动程序注册到这里,然后每次从MyDriverManager中取得连接。

MyDriver myDriver = new MyDriver();
myDriver.installAndRegist();

MyConnection conn = MyDriverManager.getConnection("myrule:mydb:127.0.0.1:8000", "root","abc");
注:我们对参数进行了改造,第一个参数由规则名:数据库名:IP地址:端口号组成,这样我们将来可以支持不同的协议和数据库种类。

因为驱动也只有一份,所以,我们也不需要生成具体的实例。
MyDriver.installAndRegist();

但这样,在程序中还需要导入MyDriver的包,我们把驱动程序写道static块中,然后改成这样
Class.forName("driver.MyDriver");

代码改造成这样:

Java不走弯路教程(5.Client-Server模式(2)-Client)

作为一个产品,我们通常提供不同版本的驱动以对应版本的升级,于是程序可能是这个样子:

 package main;

 public class MyClient{

     public static void main(String[] args) throws Exception {

         Class.forName("driver.MyDriver");

         //连接到远程服务器
         MyConnection1_1 conn =    MyDriverManager.getConnection("myrule:mydb:127.0.0.1:8000", "root","abc");

         // 获取SQL执行对象
         MyStatement1_11 st = conn.createStatement();

         //发送SQL语句
         MyResult1_1 result = st.executeQuery("select * from person");

         //输出查询结果
         while(result.next()){
             System.out.println(result.getString("username"));
         }

         //关闭连接
         conn.close();
     }
 }    

这种写法的不便之处是,产品的版本号写入了客户的代码中,这样产品升级后还需要修改客户的代码,显然是很不便的。

于是,我们可以对每个需要升级的类做一个接口,用户只需要调用接口即可:
像这样:
Java不走弯路教程(5.Client-Server模式(2)-Client)

Java不走弯路教程(5.Client-Server模式(2)-Client)

Java不走弯路教程(5.Client-Server模式(2)-Client)

Java不走弯路教程(5.Client-Server模式(2)-Client)

具体生成那个类,在具体的实现中来决定。
比如生成conn对象时时候,我们的驱动MyDriver,返回MyConnection1_1或MyConnection1_2
这样,升级驱动程序即完成了版本的升级。

本节代码可以从这里下载

https://files.cnblogs.com/files/java123vip/src01.zip

版权声明:本教程版权归java123.vip所有,禁止任何形式的转载与引用。

上一篇:biztalk中使用WCF-SQL接受传送数据【转】


下一篇:java基础进阶二:HashMap实现原理分析