【Java】JDBC基础及应用

来源:互联网 发布:网络捕鱼游戏犯法吗 编辑:程序博客网 时间:2024/06/05 09:07

在开始理解JDBC之前,应该先弄懂一个完整的数据库部署架构是怎样的?它应该包含两部分。

客户端:客户端封装数据库请求,将其发送给服务器端

服务器端:服务器端执行完毕之后,将结果返回给客户端

对于一个Java Web程序而言,我们以较为流行的MySQL数据库举例。MySQL提供了驱动程序jar包,应用程序客户端通过调用这个jar包的接口可以实现对服务器端MySQL数据库的访问。

但是,由于常见的数据有:MySQL、Oracle、DB2、SqlServer、 PostgreSQL等,数据库不同,客户端与服务器端的通信协议也不尽相同,数据库驱动程序提供的接口自然也不尽相同。对于程序开发人员,必须要熟练的掌握各种数据库接口的使用方式,这无疑是提高了程序员学习的成本。特别是需要迁移数据库时,工作显得异常的困难。

而JDBC就是为了解决这一的问题,它的重要意义在于:应用程序通过调用统一的接口可以实现对任意数据库的访问,JDBC为我们屏蔽了客户端和服务器端交互协议的实现细节。对于开发人员来说,JDBC就是一个被引用的jar包,我们只需要使用其中提供的类和方法,通过操作Java对象的方式,就可以获取数据库中的数据。


1.JDBC优势、体系架构

优点:
简单:只需要一套接口就可以实现对任意数据库的访问。
快捷:提高开发效率,压缩开发时间,让开发工作更加快捷。
移植性:由于使用了统一的接口和标准,使Java Web程序面向不同数据库时具备可移植性。
框架性:JDBC仅是定义了基本的接口和功能,基于此我们可以定义功能更加强大的框架。

体系架构:

JDBC的体系架构分为两层:上层的JDBC API主要负责与我们编写的Java Web程序进行通信,而下层的JDBC Driver API主要负责和具体的数据库进行连接。
开发人员一般需要专注上层API,而且下层的API一般由各数据库厂商来实现。


2.Driver&DriverManager

既然开发人员需要专注于JDBC API,那么我们就必须熟悉两个常用的类,即为Driver和DriverManager,由它们产生的对象可以完成对数据库的连接等,进而才能对数据库进行访问。
Driver:实际上是一个接口,定义了各个驱动程序都必须要实现的功能,是驱动程序的抽象,通过操作Driver接口即可实现对各个驱动程序的操作。
DriverManager:是Driver的管理类,开发人员通过Class.forname()方法就可以像其注册一个驱动程序。然后通过调用这个DriverManager的getConnection()方法,就可以调用该驱动程序,建立到后端数据库的物理连接。值的注意的是,getConnection()方法需要传入三个参数:DB_URL, USER, PASSWORD,后两者不用多说,接着可以看一下DB_URL的定义。
DB_URL:它是后端数据库的一个唯一标识符,应用程序通过该标识符即可确定一个唯一的数据库。其组成包括:协议,子协议,子名称三个部分。举例如下:

上图已经解析得较为清楚,唯一有一点需要指出的是。这里是以MySQL举例说明的,所以子协议自然就是"mysql",而前面提到过可以通过调用一个DriverManager的getConnection()方法来建立到后端数据库的连接,DriverManager就是根据DB_URL中的这个子协议部分确定调用对应的驱动程序,来正确建立后端数据库的物理连接。
常见的DB_URL格式有:


3.构建步骤

经过以上介绍,JDBC涉及到的类和方法并未介绍完毕,另外几个类我想先贴一段完整的JDBC构建代码,再从其中逐一介绍,相信这样更便于理解。
第一步:通过Class.forName()的方式加载数据库驱动,如果你使用的是MySQL数据库,就要定义相应的
MySQL驱动的Driver。

第二步:获得数据库连接,DriverManager类和getConnection()方法及参数前面都有提到了。这里要注意
的是它的返回值,返回的是一个Connection对象。这就是我们获取的物理链接,它代表着Java程序对后
端数据库的一条物理链接。基于这条链接,我们才能执行一些SQL语句。而Connection对象常用的方法
就有一个createStatement()。于是就到了第三步。

第三步:创建一个Statement对象(可以创建一个或多个),而Statement对象实质上就是SQL的容器,
在这个容器中,我们可以进行SQL的增删改查等语句。如图中以select为例Statement对象的executeQuery()
方法就可以执行SQL的select操作(其它SQL操作可以查阅文档以得到相应方法的用法和正确的返回值)。

第四步:上面以select为例执行的是executeQuery()方法,返回的是一个数据库查询结果的集合,这个集合是
以ResultSet这个对象来表示。但如果你是进行inser, update或delete等SQL Statement时,就需要执行
executeUpdate()方法,返回的是一个Int型对象,它表示了数据库受该SQL操作影响的行数。由于方法众多,
建议开发人员拿到实际开发需求的时候,再去查询相应的实现方法。这里我们还是着重看一下ResultSet对象,
因为它还有一些自己的方法。

第五步:遍历结果。ResultSet对象就代表了一个SQL查询的结果,由于关系型数据库本质上是一个二元表,
因此ResultSet实质上也是一个由行和列组成的二元表。而ResultSet对象它是具备一个指针的,用来指向当
前对应的一个行记录。在图中的例子,仅仅利用了ResultSet对象的next()方法使指针一行一行的移动,以及
getString()获得列名从而达到一个遍历打印的效果。实际上ResultSet对象还有一些其它的方法如previous(),
afterLast(), getInt(), getObject()等等,当实际开发有需要的时候,可以查询相应文档。

第六步:清理资源,为了避免前面步骤出现错误情况下无法清理资源的现象,我们需要将清理资源的操作放
在finally体中。而由于在创建各对象的时候就可能已经发生错误,所以需要在关闭资源上加一个null的判断,
防止抛出空指针异常。




OK,JDBC基础就介绍到这里,欢迎大家留言或联系我进行交流、相互学习。
0 0