Java技术基础时事通讯,2002年6月

本月的时事通讯为你提供了一种新方式,让你可以学习Java 编程语言基础知识、发现新资源,保持与 JDC的 New to Java Programming Center同步更新。

内容

1. Java 编程语言基础

使用JDBC 技术连接到数据库

2. 认识 Java 类库

Connection 和 DatabaseMetaData 接口,以及 DriverManager 类

3. 编程难题

MetaTest Application

4. Java 小花絮

JDBC 和 JDO

5. New to the Programming Center

建立应用程序,第 4 部分

6. 更多信息

阅读下面的文章、技术点滴、小技巧和教程,它们提供了有关这些主题的更详细信息。

Java编程语言基础

使用JDBC技术连接到数据库

JDBC是Java 2 Standard Edition (J2SE)的库,用于与基于SQL的数据库进行通信。在本文中,需要访问一个数据库。如果还没有数据库的话,MySQL是免费并开放源代码的,可用于许多不同的运行环境。可以参见后面的"更多信息"获取下载MySQL的链接。

除了要有一个工作数据库,还需要有JDBC驱动程序。由于JDBC只是设计用于所有数据库,因此使用特定的数据库时还需要一个驱动程序。驱动程序的种类繁多,有的驱动程序可以使用多多种数据库,并且可以通过JDBC Technology - Drivers找到。参见后面的"更多信息"获取链接。

从本质上来说,驱动程序把JDBC命令映射到你使用的数据库。假如你正使用的是MySQL,可以从Sourceforge.net或者MySQL.org得到它的驱动。

有了运行的数据库服务器和JDBC驱动程序,就可以使用JDBC库了。像使用任何类一样,让JDBC驱动程序类在编译器和运行时环境都可用。配置CLASSPATH环境变量或者拷贝包含这些类的合适的JAR文件到$JAVA_HOME/jre/lib/ext 目录,这个目录位于Java2 Platform (J2SE)的基本安装目录下。

一旦为数据库和驱动程序设置好了环境,就可以开始写代码了。开始使用JDBC包括两个步骤:

第一步:载入必要的JDBC驱动程序。仅仅使这些类在运行时环境中可用是不够的。

第二步:连接到数据库。连接包括识别特定的数据源,并用以这个数据源为基础使用适当的驱动程序。

下面将说明,有不止一种方法可以完成上面概括的两步。

第一步:载入JDBC驱动

在最简单的情况下,JDBC驱动只是一些类。他们必实现java.sql.Driver接口,但是开发人员极少需要直接使用接口。驱动程序实现只需要在类载入时使用java.sql.DriverManager来注册自身。这种需要是驱动程序供应商的职责,而不是驱动程序使用者的职责,对于你来说,所有需要做的是载入这个类,这可以用三种不同的方法来完成。

第一种可能的方式是载入JDBC驱动程序:

创建一个类的实例。在识别数据库并找到想要使用的特定驱动程序后,可以手工编码对构造函数的调用。

例如,在路径里使用mysql-2.0.13-bin.jar来访问MySQL,需要创建一个org.gjt.mm.mysql.Driver类的实例:

Driver d = new org.gjt.mm.mysql.Driver();

这种技术在载入驱动程序时工作得很好,但它确实有一些缺点。因为JDBC是数据库不明确的(database-agnostic),所以需要应用程序用户使用MySQL。如果用户碰巧使用的是Oracle或者SyBase,那就坏了。他们仍然必须获得MySQL才能运行你的程序。

另一个问题是,通过显式创建驱动程序实例,实际上创建了两个实例。如前如述,驱动程序必须在载入类时用DriverManager注册自身。因此,当类载入的时候,类创建了一个自己的实例,并使用DriverManager注册自身。通过直接调用构造函数,又创建了第二个实例。

第二种载入JDBC驱动程序的可能方法。

为了避免创建两个驱动程序实例,将类名作为字符串传递给Class的ForName方法。类名是完全限定的,像MySQL驱动程序使用的org.gjt.mm.mysql.Driver一样,并作为引用字符串,如下所示:

Class.forName("org.gjt.mm.mysql.Driver");

在以上两种情形中,很难手工编码数据库驱动程序的名字,但第二种方法更可取。因为驱动是在运行时动态载入的,驱动程序的类不必在编译时可用,所以这里你不必手工编码字符串。你能做的是从命令行或其他地方获取驱动程序名并传递过去。那样,你就可以使用桌面上的MySQL进行测试,并且你的客户可以使用他们服务器上的Oracle,而不用改变源代码或者重新编译。

String driver = args[0];
Class.forName(driver);

第三种载入JDBC驱动程序的方法:

前面两种载入技术需要从某个地方传递驱动程序名。还有第三种载入驱动程序的方法,并且不需要任何源代码。通过设置jdbc.drivers的系统属性,可以指定驱动程序或者驱动程序集,如下所示:

java -Djdbc.drivers=org.gjt.mm.mysql.Driver ProgName

这样在需要驱动程序时,DriverManager就可以自动找到它。如果有多个JDBC驱动程序时,以冒号隔开驱动程序列表。

第二步:连接到数据库

数据源通过"jdbc:"开始的URI来识别。跟在"jdbc:"后面的部分由JDBC驱动程序确定。每个驱动程序提供了唯一一个字符串映射到驱动程序,还有一些机制用于定位驱动程序所针对的服务器。

就MySQL驱动程序来说,字符串特别适合用"mysql",并且由另一个URI指定位置。整个字符串的全部格式看起来如下:

jdbc:mysql://[hostname][:port]/[dbname][?param1=value1][¶m2=value2].....

更具体地说,如果想要连接的主机是你自己的机器,数据库名是用于测试的,就不必提供用户名和密码,最后的字符串看起来类似如下:

jdbc:mysql://localhost/test

一旦有了识别驱动程序所需的合适URL并让驱动程序连接到数据源,那么就可以真正地连接到数据源了。DriverManager为这种查询提供了getConnection方法。它从第一个支持特定协议(这里是mysql)的驱动程序返回Connection对像。如果没有注册的驱动程序支持协议,运行时就会抛出一个异常。

String uri = "jdbc:mysql://localhost/test";
Connection con =
   DriverManager.getConnection(uri, username, password);

子协议的名字,这里是mysql,在JDBC驱动程序的文档里指定了。

一旦创建了到数据源的连接,就可以访问它了。然而还有另一种方法可以识别和连接到数据源:可以使用JNDI (Java Naming and Directory Interface )命名服务来访问数据源。

一旦使用JNDI而不是使用Driver和DriverManager建立了连接,就可以使用DriverSource和Contex。在MySQL这种特定情况下,javax.sql.DriverSource实现是org.gjt.mm.mysql.jdbc2.optional.MysqlDataSource类。但是它一般情况下都是在应用程序之外注册。所有需要应用程序来完成的就是查找基于绑定到上下文名称的数据源。
Context ctx = new InitialContext();
ctx.addToEnvironment(Context.INITIAL_CONTEXT_FACTORY,
   "com.sun.jndi.fscontext.RefFSContextFactory");
DataSource ds = (DataSource)ctx.lookup("/tmp/jdbc/test");
Connection con = ds.getConnection(username, password);

一旦有了连接,就可以像DriverManager查找一样访问数据库了。DataSource查找一般在J2EE应用程序上下文里完成。

你可能知道何进可以使用JNDI环境,但它通常不只是设置用于查找JDBC数据源。

MySQL有一组测试套件,可用于测试连接到数据库的不同方法。请查看测试套件包里的声明和JNDIDataSource测试例子。如果使用不同的数据库,你可以要么检查自己的例测试子,要么检查这方面细微的调整,以便使用特定的驱动驱程序和其他数据库的数据源。

要测试您掌握有关使用JDBC连接到数据库的知识,请进入在线测试

认识 Java 类库

Connection 和 DatabaseMetaData接口,以及 DriverManager 类

JDBC 提供了 API 用于访问和处理存储在数据源中的数据,比如使用Java编程语言的关系数据库。API包括了 java.sql 包,也叫做JDBC 核心 API,以及 javax.sql 包,也叫做 JDBC Optional Package API,它被包括在 J2SE, v 1.4 的下载中。

这里讨论的接口和类可以在 java.sql 包中找到。

Connection 接口表示一个带有数据库连接的会话,它由驱动程序提供。它还提供了创建语句和管理连接及其属性的方法。Connection 对象的数据库可以提供一些信息,包括描述它所包含的表、支持它的SQL语法、它的存储过程、这种连接的能力,等等。这种信息通过getMetaData 方法获得:

public DatabaseMetaData getMetaData()
                     throws SQLException 

DriverManager 类是管理JDBC驱动程序的实用工具类。它保存了系统已注册JDBC的列表,并完成与驱动程序的连接。首先使用这个类通过getConnection 方法获得一个 Connection 对象引用:

  • getConnection(String url)
    试图建立到给定数据库 URL的连接。

  • getConnection(String url, Properties info)
    试图建立到给定URL的连接。
    参数:
    url - 形成jdbc:subprotocol:subname的数据库 url 。
    info - 任意 String 名/值对的列表,用作连接参数。通常应该至少包括一个 "user" 和 "password" 属性。

  • getConnection(String url, String user, String password)
    试图建立到给定URL的连接。
    参数:
    url - 形成jdbc:subprotocol:subname的数据库 url 。
    user - 数据库用户,他们可以建立连接。
    password - 用户的密码。

DatabaseMetaData 接口提供了有关数据库的信息。 接口中的有些方法采用字符中模式。一个方法获得驱动程序不支持的某个特性的信息时,将会抛出 SQLException 异常。

一些方法:

  • getDriverName
    获得这个 JDBC 驱动程序的名字。
  • getDriverVersion
    以字符串形式获得这个 JDBC 驱动程序的版本号。
  • getDatabaseProductVersion
    获得数据库产品的版本号。

编程难题

  • 创建连接到数据库的程序。
  • 显示进行连接的有关数据库与驱动程序的信息。

通过与这个连接相关联的DatabaseMetaData接口,即可使用访问数据库信息的方法。

参见编程难题的可能解决方法

Java小花絮

JDO (Java Data Objects)是透明数据库访问的API。程序员可以使用Java语言编写代码,透明地访问底层数据存储,而无需使用特定于数据库的代码。

JDO 和 JDBC API是互相补充的方法。这些技术有各自的能力,程序员可将其用于各种不同的技巧集和开发目标。

通过为程序员提供对数据库访问和缓存管理的直接控制,JDBC API 提供了更大的灵活性。 JDBC API是最成熟的技术,并且作为最完整的API广为接受。

JDO 为程序员提供了便利性和编译时类型检查。另外,JDO向程序员隐藏了SQL,因此程序员不必再学习SQL。

JDO API目前正由 Java Community Process创建。

New to Java Programming Center

学习如何创建滚动条、弹出式选项框,以及如何从文件读取内容和向文件写入内容。

建立应用程序,第4部分

更多信息

下载和安装MySQL

JDBC 数据访问 API

建立连接

JDBC 2.0 基础

DriverManager

Connection

IDatabaseMetaData接口

Java Naming and Directory Interface (JNDI)

JDO API

Java Community Process

New to Java Programming Center

建立应用程序入门

编程难题解决方案

参见June Program Challenge获得可能的解决方案。

下载 Java 2 Platform

要进行Java开发,你需要J2SE开发工具包提供的类库,编译器、工具和运行时环境。

 

常见问答

下载中心

产品简介

 

 

Solaris论坛