资源预览内容
第1页 / 共68页
第2页 / 共68页
第3页 / 共68页
第4页 / 共68页
第5页 / 共68页
第6页 / 共68页
第7页 / 共68页
第8页 / 共68页
第9页 / 共68页
第10页 / 共68页
亲,该文档总共68页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第4章 JDBC简介,数据库是数据管理最重要的途径之一,也是Web应用最重要的数据源。在早期,对数据库的访问都是使用数据库厂商提供的专用API(application programming interface,应用程序编程接口)进行的。Java语言发布后,为了支持数据库的访问操作,Sun公司于1996年推出了JDBC(Java database connectivity,Java数据库连接)。JDBC定义了一套访问关系数据库的标准Java类库。通过JDBC API,用户可以方便地操作关系数据库。此外,JDBC还为数据库厂商提供了一个标准的体系架构,厂商能够针对数据库产品提供特定的JDBC驱动程序,从而提高了Java访问数据库的效率。 本章逐一介绍了JDBC API主要的接口功能和使用方式,并给出了相应的示例程序。最后利用JDBC API实现了一个简单的学生管理系统,其中包括学生信息的增加、查看、修改和删除等功能。,4.1SQL语言与JDBC,SQL(structured query language,结构化查询语言)语言是于1974年由Boyce和Chamberlin提出,并在1979年由IBM公司在其研制的关系型数据库System R中实现的。由于SQL语言功能丰富、语法简洁,因此深受用户的喜爱。1986年10月,美国国家标准局批准SQL语言作为关系型数据库的标准语言。SQL语言是一种介于关系代数和关系演算之间的结构化查询语言,但SQL语言不仅仅局限于查询,它是一个通用的、功能强大的关系型数据库语言。 在基于Java的应用程序开发过程中,为了降低程序开发的复杂度,提高程序开发效率,通常使用JDBC和SQL相互配合,共同完成访问关系型数据库的工作。JDBC负责将SQL语句传递给数据库,然后从数据库中获取返回结果,并组装为结果集返回给客户,其运行方式如下图所示。,4.2JDBC API,JDBC API是Java平台提供的一个标准的数据库访问接口集,是支持数据库操作的类与方法的集合,利用它开发人员在编写应用程序时不必考虑所用的数据库。JDBC API 包括java.sql和javax.sql两个包。java.sql包包含了JDBC的核心API;而javax.sql包则包含了JDBC标准的扩展API。JDBC API 提供了以下基本功能: (1)建立与数据源的连接。 (2)向数据源发送查询和更新语句。 (3)处理从数据源得到的结果。 实现上述功能的JDBC API 的核心类和接口均定义在java.sql包中。熟练掌握这些类和接口的使用方法,是JDBC程序设计的基础,也是构建更复杂、更高级的应用程序的必要条件。,4.2.1管理驱动程序类DriverManager,DriverManager类是JDBC的管理层,作用于用户和数据库驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。另外,DriverManager类也处理诸如驱动程序登录时间限制,以及登录和跟踪消息的显示等事务。DriverManager类中常用的方法如下表所示。,4.2.2数据库连接类Connection,Connection对象代表与数据源进行的唯一对话。Connection类提供了进行事务处理、创建执行SQL语句和创建存储过程所用对象的方法。同时,Connection类还提供了一些基本的错误处理方法。Connection类的实例可以通过DriverManager.getConnection()或DataSoure.getConnection()方法创建。java.sql.Connection类提供的常用方法如下表所示。,4.2.3SQL声明类Statement,Statement类用于将SQL语句发送到数据库中。实际上有三种Statement类:Statement、PreparedStatement和CallableStatement,它们都专用于发送特定类型的SQL语句。其中,Statement用于执行不带参数的简单SQL语句。Statement对象用Connection的createStatement方法创建,具体格式如下: Statement stmt=conn.createStatement();,4.2.4PreparedStatement类,由上一节可知,Statement类使用SQL语句直接处理查询。在执行过程中,Statement类把SQL语句提交给数据库,数据库分析执行SQL语句,然后将执行结果返回给用户。值得注意的是,使用Statement类,即使重复执行同一查询,SQL语句也要由数据库再次格式化;尤其是当SQL语句中包含where子句时,每一次查询都需要数据库解析、优化,然后才能返回执行结果。 因此,使用Statement类将会在很大程度上影响重复数据查询的执行效率。 为了提高查询效率,对于同一个查询语句,JDBC API提供了PreparedStatement类来优化这一过程。PreparedStatement是Statement的扩展,代表了一条预设SQL语句。预设语句是指预先将SQL语句传送给数据库,并在数据库中被编译、优化并缓存。也就是说,使用PreparedStatement类,SQL语句不需要在每次执行时都由数据库重新编译和优化,而仅需编译和优化一次,这就提高了执行查询的效率和性能。 另外,已编译的SQL语句可以指定输入参数,用于定制特殊SQL语句的执行效果。输入参数可以是select或者update语句中的where子句中的值,也可以是insert语句中的values子句中的值。使用预设语句时,PreparedStatement将SQL语句及其参数提交给数据库,由数据库对这些语句进行预处理。,4.2.5查询结果类ResultSet,一旦建立了数据库连接并执行了SQL语句,就可以从Statement实例中获取一个以ResultSet表示的结果集。ResultSet类封装了执行SQL查询所得到的数据行或元组。ResultSet类提供了一系列的方法,用于在返回的结果集中自由移动指针,以加强应用程序的灵活性并提高访问数据的效率,这些方法如下表所示。,4.2.2 文本的编辑,4.2.6数据库操作异常类SQLException,基本上所有JDBC API的方法都会抛出SQLException异常。这个异常类继承了java.lang.Exception接口,并通过重写的getMessage()方法获取产生异常的原因和所生成异常的相关信息。 SQLException类的构造方法包含了一个字符串,这是数据库服务器或JDBC驱动程序根据SQL状态给出的异常产生原因。SQL状态是一个标准化的字符串,包含了产生异常的SQL处理状态,以及与数据库厂商相关的错误码(一个整数)。SQLException类提供的构造方法如下: (1)SQLException():创建一个新的SQLException,将产生异常的原因、SQL处理状态以及厂商错误码的值设为NULL。 (2)SQLException(String reason):创建一个新的SQLException,设置产生异常的原因,并将SQL处理状态以及厂商错误码的值都设为NULL。 (3)SQLException(String reason, String SQLState):创建一个新的SQLException,设置产生异常的原因和SQL处理状态,并将厂商错误码的值都设为NULL。 (4)SQLException(String reason, String SQLState,int vendorCode):创建一个新的SQLException,并设置产生异常的原因、SQL处理状态以及厂商错误码的值。,此外,SQLException类提供了如下方法,以实现被抛出异常的内部数据的访问: (1)int getErrorCode():返回异常的厂商错误码。 (2)SQLException getNextException():如果还有异常,则检索异常链中的下一个异常。 (3)String setNextException(SQLException e):设置当前对象的异常链中的下一个异常。 注意:由于大部分JDBC方法都会抛出SQLException异常,因此,在应用程序中,必须捕捉异常对象,并进行适当的处理,然后把错误码返回给调用者。此外,在程序运行结束时,必须使用finally语句块关闭Connection对象,而不管是否产生了SQLException异常。,4.3JDBC驱动程序的类型,通常,当数据库厂商推出自己的数据库产品时,都会提供一套访问数据库的API,这些API能以各种编程语言的形式提供,客户端程序通过调用这些专有的API来访问数据库。各个厂商提供的数据库访问API不尽相同,导致构建在某一个特定数据库上的应用程序不能移植到另一个数据库上。JDBC以Java类库的形式取代数据库厂商的专有API,客户端只需要调用JDBC API,而处理与数据库通信的具体操作由JDBC的实现层(即JDBC驱动程序)完成,从而降低了应用程序与数据库之间的耦合度。,JDBC驱动程序分为以下四类: (1)JDBC-ODBC桥。 (2)Java到本地API。 (3)JDBC网络纯Java驱动程序。 (4)本地协议纯Java驱动程序。,4.3.1JDBC-ODBC桥连接,因为Microsoft推出的ODBC比JDBC出现的时间要早,所以绝大多数的数据库都可以通过ODBC来访问,当Sun公司推出JDBC的时候,为了支持更多的数据库,特意提供了JDBCODBC桥。JDBCODBC桥本身也是一个驱动,利用这个驱动,用户可以使用JDBC API通过ODBC去访问数据库。这种桥机制实际上是把标准的JDBC调用转换成相应的ODBC调用,并通过ODBC把数据库调用发送给ODBC数据源,其原理如下图所示。,由图可以看出,通过JDBC-ODBC桥的方式访问数据库需要经过多层的调用,因此,利用JDBC-ODBC桥访问数据库的效率比较低。然而,当数据库没有提供JDBC驱动,只有ODBC驱动的情况下,也只能利用JDBC-ODBC桥的方式访问数据库,例如,在访问Access数据库时,就只能使用JDBC-ODBC桥来访问。,4.3.2Java到本地API,大部分数据库厂商都提供与他们的数据库产品进行通信所需要的调用API,这些API往往用C语言或类似的语言编写,依赖于具体的平台。此类型的JDBC驱动程序使用Java语言编写,并能够调用数据库厂商提供的本地API。此时,利用JDBC API访问数据库时,JDBC驱动程序将数据库调用请求转换为厂商提供的本地API调用,数据库处理请求,然后将处理结果通过这些API返回,进而返回给JDBC驱动程序,最后,JDBC驱动程序将结果转化为JDBC标准形式,再返回给客户程序。其原理如下图所示。,从图中可以看到,通过这种类型的JDBC驱动程序访问数据库时,减少了ODBC的调用环节,提高了数据库访问的效率,并且能够充分利用厂商提供的本地API功能。但是,在这种访问方式下,需要在客户的机器上安装本地JDBC驱动程序和特定厂商的本地API。,4.3.3JDBC网络纯Java驱动程序,这种驱动利用作为中间件的应用服务器来访问数据库。应用服务器作为一个或多个数据库的网关,客户端通过它可以连接到不同的数据库服务器。应用服务器通常都有自己的网络协议,Java程序通过JDBC驱动程序将JDBC调用发送给应用服务器,应用服务器使用本地驱动程序访问数据库,从而完成请求。其原理如下图所示。,使用这类驱动程序的优点是可以直接通过JDBC访问网络数据库,不需要安装驱动程序,程序与平台无关,不仅可以用在一个第三方的解决方案中,而且可以在Internet上使用。,4.3.4本地协议纯Java驱动程序,这种类型的JDBC驱动程序完全用Java语言编写,通过与数据库直接连接的套接字进行通信,它采用
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号