Java不走弯路教程(5.Client-Server模式(2)-Client)
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所有,禁止任何形式的转载与引用。
Java不走弯路教程(5.Client-Server模式(2)-Client)的更多相关文章
- Java不走弯路教程(4.Client-Server模式(1)-Server)
4.Client-Server模式(1)-Server 在上一章中,我们完成了MyDataBase.java的编写,类似于一个简单的数据库功能,提供了用户验证,查询操作. 在本章中,我们将继续扩展这个 ...
- Java不走弯路教程(1.环境搭建)
1.环境搭建在开始写第一个Java程序之前,我们需要做一些简单的准备工作. 1.1 还记得DOS吗 我们可以通过图形界面来操作我们的电脑.但作为程序员,你首先需要学会用命令行的方式来操作电脑,因为不是 ...
- Java不走弯路教程(前言)
本教程的程序基于Windows开发,所以你需要有一台安装Windows操作系统的电脑. 前言本教程将带你完成Java的初学和WEB框架的开发,学完本教程,你将完成对Java的入门并且对下一步不再迷茫. ...
- Java不走弯路教程(2.Hello,Java!)
2.Hello,Java! 欢迎来到Java的世界,在上一章,我们已经完成了DOS的基本操作学习和Java的环境搭建,在本章中我们Java来完成一个简单的DOS程序. 2.1 Hello,Java! ...
- Java不走弯路教程(3.用户验证与文件内容查询)
3.用户验证与文件内容查询 在上一章中,我们完成了对指定文件内容的输出操作. 我们现在有如下格式的文件product.db id,product_name,product_detail 1,noteb ...
- Java不走弯路教程(6.JDBC)
6.JDBC 在上一章,我们完成了MyDb数据库的简单的客户段调用.作为产品我们还封装了驱动程序,并且提供了统一的调用接口. 大家应该知道,市面上有多种数据库产品,比如Oracle,Mysql,DB2 ...
- Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别
前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露.并行与并发.Client模式和Server模式.Minor GC和Full GC,本文详细讲解下这些概念的区别. 内存溢出 ...
- java虚拟机--jvm client模式与server模式的区别
JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升.JVM如果不显式指定是-Server模式还是-clien ...
- Java虚拟机10:Client模式和Server模式的区别
部分商用虚拟机中,Java程序最初是通过解释器对.class文件进行解释执行的,当虚拟机发现某个方法或代码块运行地特别频繁的时候,就会把这些代码认定为热点代码Hot Spot Code(这也是我们使用 ...
随机推荐
- iPhone全部设备分辨率速查
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...
- 学习笔记7-Android短信发送器
新建一个Android项目sns. 在String.xml添加文字 <resources> <stringname="app_name">Sns发送短信&l ...
- iOS开发之七:常用控件--UISlider、UISegmentedControl、UIPageControl的使用
一.UISlider的使用 其实UISlider在iOS开发中用的似乎不是很多,我们看到的用到的地方多是音乐播放器的音量控制,以及视频播放器中的音量控制. 还是记录一下吧! 1.常用属性 // 设置获 ...
- 寻找第k元
要求:给定一个数组array[n],寻找大小排在第k的元素 思路一:最直接的思路就是先排序,这样可以直接通过数组下标找到第k大的元素,最好的快速排序时间复杂度为O(nlogn). 思路二:我们可以在快 ...
- java设计模式---桥接模式
桥接模式的目的是把抽象和具体实现分离,其uml类图如下所示: public interface SendMessage { abstract void send(String message,Stri ...
- Opencv2.4.9、VS2010配置及grabcut代码实例
最近opencv库更新到了2.4.9,作为小码农的我紧跟时代的步伐,装了2.4.9这个库.以下是我的配置步骤: 1.从http://opencv.org/上下载opencv2.4.9文件,由于我用的是 ...
- Androd选取相册照片和拍照处理-android学习之旅(62)
实现如下图所示效果 核心代码 -构建打开相册和拍照的Intent 拍照 File outputImage = new File(Environment.getExternalStorageDirect ...
- ROS_Kinetic_12 ROS程序基础Eclipse_C++(三)usb camera
ROS_Kinetic_12 ROS程序基础Eclipse_C++(三)usb camera 软件包下载地址:https://github.com/bosch-ros-pkg/usb_cam 下载后, ...
- 07_Android操作sqllite数据库(包括2中方式操作数据的方式),单元测试,BaseAdapter的使用,自定义view的综合使用案例
1 目标从sqllite中读取数据并显示如下: MainActivity对应的界面 MainActivity2对应的界面 2 配置Android的清单文件 <?xml ...
- JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别
JAVA之旅(十)--异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别 不知不觉,JAVA之旅这个系列已经更新到第十篇了,感觉如梦如幻,时间 ...