5.Client-Server模式(2)-Client
在上一章,我们完成一个简单的数据库服务器,并在客户端用telnet方式成功进行通信。
本章将用Java实现客户端程序,来代替telnet。
先看代码
下面是客户端与服务器的协议:
建立连接
服务器 发送:Input your name password:
客户端 发送:用户名空格密码
服务器 发送:verify ok
客户端 发送:SQL语句
服务器 发送:查询结果
客户端 发送:exit
断开连接
这样我们模拟了一个简单的数据库服务器和客户端的交互过程。
算作我们的数据库产品,我称他为MyDB
这样提供给用户使用,很不方便,因为用户要了解我的协议,才可以使用。
而用户需要的只是数据库的地址,端口,用户名,密码。
然后发送SQL语句,返回查询结果。这些简单的需求。
注:我们抛掉了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");
代码改造成这样:
作为一个产品,我们通常提供不同版本的驱动以对应版本的升级,于是程序可能是这个样子:
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(); } }
这种写法的不便之处是,产品的版本号写入了客户的代码中,这样产品升级后还需要修改客户的代码,显然是很不便的。
于是,我们可以对每个需要升级的类做一个接口,用户只需要调用接口即可:
像这样:
具体生成那个类,在具体的实现中来决定。
比如生成conn对象时时候,我们的驱动MyDriver,返回MyConnection1_1或MyConnection1_2
这样,升级驱动程序即完成了版本的升级。
本节代码可以从这里下载
https://files.cnblogs.com/files/java123vip/src01.zip
版权声明:本教程版权归java123.vip所有,禁止任何形式的转载与引用。