英语原文共 89 页,剩余内容已隐藏,支付完成后下载完整资料
Java Database Connectiity(JDBC)
7 . Java数据库连接(JDBC)
学习目标
读完这一章,你应该:
了解JDBC是什么以及为什么需要它;
了解与之相关的JDBC的不同版本以及Java的不同版本;
了解如何使用JDBC连接到数据库通过使用Java的DriverManager类;
知道如何使用JDBC-ODBC桥驱动程序;
了解如何使用JDBC执行SQL查询和更新和如何处理返回的结果;
了解如何通过JDBC进行事务处理;
了解如何使用JDBC查找数据库有关的结构信息;
知道如何使用JTable来格式化数据库查询的结果;
知道如何使用JDBC 2.0在返回的查询行中自由移动;
了解如何使用JDBC 2.0通过Java方法修改数据库,了解如何使用Java的数据源接口用JDBC连接到数据库;
了解使用了DriverManager类的数据源接口的优点;
前三章使用了“平面”文件来提供持久的数据存储。当然,现在大多数组织都将大部分数据结构化到数据库中,这些数据库通常需要从多个站点访问。这些数据库几乎都是关系数据库。用Java编写的程序可以通过Java数据库连接(JDBC)API与关系数据库(不管是本地的还是远程的)进行通信,后者成为了JDK 1.1的核心Java发行版的一部分。在本章中,我们将考虑如何通过JDBC访问这些远程数据库。
7.1供应商变更问题
当试图为所有关系数据库提供一些通用访问方法时,一个基本的问题就是如何处理从供应商到供应商的数据库内部格式的变化(以及相关的数据库API)。例如,Oracle内部的Java数据库连接格式与Access数据库的格式不同,而MySQL数据库的格式与这两种数据库的格式都不同。
为了使用JDBC访问特定类型的关系数据库中的数据,需要提供一些中介软件,允许JDBC与该数据库的特定供应商的API通信。这种软件被称为驱动程序。合适的驱动程序通常由数据库供应商自己或第三方提供。有关特定数据库的JDBC驱动程序的信息,请访问http://servlet.java.sun.com/products/jdbc/drivers。这些驱动程序可能是纯Java编写的,或者是Java和Java本地接口(JNI)方法的组合。(JNI允许Java程序员使用用其他编程语言编写的代码。)但是,这些细节超出了本书的范围,没有进一步提到这些不同的类别。
在Java出现之前,微软已经为访问具有不同内部格式的数据库提供了自己的解决方案:开放数据库连接(ODBC)。尽管(毫不奇怪)ODBC驱动程序最初只适用于Microsoft(MS)数据库,但是其他供应商和第三方供应商已经为大多数非MS数据库提供了ODBC驱动程序。意识到这个这个事实,Sun在包sun.jdbc.odbc中提供了JDBC-ODBC桥驱动程序,他包含在J2SE中(并且已经从JDK 1.1移植到Java中)。这个驱动程序将JDBC协议转换为对应的ODBC,并允许Java程序员访问具有ODBC驱动程序的数据库。但是,添加一个额外的转换阶段可能会导致某些大型数据库密集型应用程序的长时间延迟。事实上,引用Sun网站上的一句话“hellip;hellip;在SDK中包含的桥驱动程序仅适用于实验性的使用,或者在没有其他驱动程序可用的情况下”。
7.2 SQL和JDBC的版本
访问关系数据库的标准方法是使用SQL(结构化查询语言)。不熟悉SQL的读者在继续阅读本章之前,请阅读本主题的附录。这反映在一个事实上,即包含核心JDBC API的包被称为java.sql。
使用JDK 1.1发布的原始JDBC是JDBC 1.0,这仍然是许多现有驱动程序编写的JDBC版本,尽管现在这些驱动程序属于少数。当JDK 1.2(J2SE 1.2)问世时,它集成了JDBC 2.0并且引入了几个新特性,比如在结果集中滚动向前和向后滚动,并使用Java方法(而不是SQL命令)对数据库表进行更新。随着J2SE 1.2.2的出现,JDBC 2.1被移植到J2SE 1.3中。除了JDBC 2.1提供的一些额外功能外,还为希望执行服务器端数据库操作的Java程序员提供了可选的下载(例如经常与Enterprise javabean相关的操作)。这个可选的包由以下稍有不同的名称所标识,这取决于访问的Sun站点的哪部分(!):JDBC 2.0可选的包API;JDBC 2.0扩展包API;JDBC 2.0标准扩展API。这个API包含在Java包javax.sql中。
JDBC API的最新版本是JDBC 3.0(2002年2月13日发布)。使用这个API,不仅可以从关系数据库访问数据,还可以从电子表格和平面文件中访问数据,从任何数据源。JDBC 3.0包含两个包java.sql和javax.sql,并被包含在J2SE 1.4中。JDBC 3.0中引用的两个最重要的特性可能是连接池和保存点。前者允许应用程序服务器维护一个开放连接的集合或“池”,这些连接可用来连接客户端,并节省创建新连接所需的时间。Savepoint借口允许程序员将事务划分为逻辑断点,从而控制事务被回滚的程度。
尽管这些新特性对J2EE程序员特别重要,但它们也对J2SE程序员有用。JDBC 3.0规范的指导设计原则之一是维护与现有应用程序和驱动程序的兼容性。因此,JDBC 2.0的用户可以期望他们的应用程序在JDBC 3.0下正常运行。此外,编写到JDBC 1 API的代码将继续在JDBC 3下工作。与此同时,JDBC 4编写正在开发中,预计将包含在J2SE 6中,这一版本将在本文发布时发布。
目前最常用的JDBC版本是JDBC 2,不过仍有很多JDBC 1驱动程序,以及越来越多的JDBC 3驱动程序。在前一节(http://servlet.java.sun.com/products/jdbc/drivers)中给出的URL的驱动程序总数为220。其中83个是JDBC 1驱动程序,104个是JDBC 2驱动程序,33个是JDBC 3驱动程序。由于许多驱动程序仍然是基于JDBC 1,接下来的几节将引用这个版本的API,但是后面的部分将引用JDBC 2和JDBC 3的特性。
在接下来几节的示例中,一个简单的MS Access 数据库将用于说明的目的,这意味着可以使用内置桥-odbc驱动程序(即使如上所述的7.1,这可能不是最好的策略在许多商业应用程序)。尽管这可能是由于MS Access 的广泛使用和可用性以及J2SE中的JDBC-ODBC桥驱动程序的包含,但它确实引入了一个复杂的问题:我们必须创建一个ODBC数据源。下一节将介绍这样做的过程。不过,在开始此部分之前,值得一提的是,希望与其他数据库(如Oracle或MySQL)进行试验的读者可能会发现,需要将适当的JDBC驱动程序放置在文件夹J2SE5.0\jre\lib\ext中。(无论如何,这肯定是作者的经历。)
7.3创建一个ODBC数据源
在通过Java程序访问ODBC驱动的数据库之前,需要将数据库注册为一个ODBC数据源。一旦完成,数据库就可以通过它的数据源名称(DSN)来引用。假设已经创建了数据库,下面显示了设置自己的ODBC数据源所需的步骤。(这些说明是用在Windows上的Java数据库连接,XP机器和某些项目的命名可能与其他MS操作系统稍有不同,但是基本步骤应该保持不变。)
- 使用鼠标,从启动菜单中选择Start Control Panel。
- 双击管理工具。
- 双击数据源(ODBC)来显示ODBC数据源管理员窗口。
- 确保选择了用户DSN选项卡。
- 单击Addhellip;hellip;按钮以显示创建新数据源窗口。
- 选择Microsoft Access Driver(*.mdb)并单击Finish。
- 要在目录结构中定位所需的数据库,请单击选择hellip;hellip;按钮。
- 导航目录结构并选择所需的数据库。
- 为数据源提供一个(有意义的)名称。(“描述”字段可选)。
- 如果指定用户名和密码(不是强制的,也不是必需的,对于本节中的示例),选择Advanced Options,然后在值中键入key,单击OK完成。
- 单击OK完成注册,记住,上述过程只需要ODBC数据库!下一节将描述我们的Java代码如何利用数据库的DSN从数据库中检索数据。
7.4简单的数据库访问
接下来,将对连接、语句和ResultSet对象进行引用。这三个名称实际上引用的是接口,
而不是类,因此,引用这些接口的对象可能不是完全正确的。但是,每个JDBC驱动程序必须实现这三个接口,然后可以使用实现类创建可以方便地称为连接、语句和ResultSet对象的对象。在7.7节中,类似的注释也适用于接口ResultSetMetaData和DatabaseMetaData。从现在开始,这样的术语将会被自由的使用,这一点将不再被进一步研究。
使用JDBC访问数据库需要几个步骤,如下所述。
- 加载数据库驱动程序。
- 建立到数据库的连接。
- 使用连接创建语句对象并存储引用这个对象。
- 使用上面的语句引用来运行一个特定的查询或更新声明并接收结果。
- 操作并显示结果(如果查询)或检查/显示受影响的数据库行数(用于更新)。
- 重复步骤4和5,以便进行更多的查询/更新。
- 关闭连接。
为了便于说明,我们假设存在一个名为财务的MS Access数据库。拥有一个名为财务的MS Access数据库。拥有一个名为Accounts的单个表的mdb。这个简单表的结构如下所示。
字段名MS Access 类型Java类型。
acctNum int 数
姓氏 文本字符串 firstname 文本字符串 平衡货币 浮点数。
我们将进一步假定给数据库的DSN是财务。让我们依次为这个数据库做以上7个步骤。
- 加载数据库驱动程序
这是通过类的静态方法来实现的:
Forname(“sun.jdbc.odbc.JdbcodbcDriver”);
【只是顺便说一下,它的名字和它的用途之间没有明显的联系,这是值得评论的。这在标准Java库中非常少见,因为它们几乎都是良好的命名实践的范例。第一眼看上去,类类的命名也很糟糕,但是这个类用来保存操作其他类的方法,以提供其特征的细节。
- 建立到数据库的连接
我们声明一个连接引用,并调用类DriverManager的静态方法getConnection,以返回该
引用的连接对象。方法getConnection采用三个字符串参数:一个URL风格的数据库地址、一个用户名、一个密码。
JDBC API规范建议数据库地址有以下格式:
Jdbc::
这里,指定了一个数据库连接服务并提供了服务所需的所有信息,以定位数据库
(通常是指向数据库的URL路径)。对于一个具有数据源名称财务的本地ODBC数据库,子协议是ODBC,地址的最后一部分仅仅是数据源的名称:
Jdbc:odbc:finances
假设我们的finances数据库确实是本地的,并且我们没有为这个数据库设置用户名或密
码,那么打开与数据库的连接所需的行将类似于:
Connection link=DriverManager.getConnection(“jdbc:odbc:finances”,””,””);
如果这个相同的数据库是远程的,那么上面的行应该是这样的:
Connection link=
DriverManager.getConnection(“jdbc:odbc://AnyServer.SomethingElse.com/Finances”,””,””);
但是,API指定的语法只是一个建议,数据库供应商可以自由地忽略这一点。因此,一些驱动程序可以使用与上面显示的不同的语法来指定子协议和数据源。由驱动程序管理器来查询每个加载的驱动程序,以确定驱动程序是否识别正在处理的数据库类型。
- 创建一个语句对象并存储其引用
通过调用我们的连接对象的createStatement方法创建一个语句对象(在前一个步骤中,
它的引用保存在变量链接中)。通过调用createStatement返回的对象的地址保存在语句引用中。在上面的行中,这个引用被简单的称为statement。
Statement statement=link.createStatement();
- 运行查询/更新并接收结果
SQL中的DML(数据操作语言)语句可分为两类:从数据库中检索数据的类别(即:选
择语句)和那些以某种方式改变数据库内容的插入,删除和更新语句。类语句有方法executeQuery和executeUpdate,分别用于执行这两个类别。前一个方法返回ResultSet对象,而后者返回一个整数,该整数表示受更新操作影响额数据库行数。(我们将推迟对方法执行更新的考虑,直到下一部分。)
通常,将SQL查询存储在字符串变量中,然后用这个字符串调用executeQuery作为参数,以避免相当麻烦的调用行。在下面的例子中,我们也遵循了这种做法。
(i)
String selectAll=”SELECT*FROM
全文共8917字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[15518],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。