返回介绍

15.7 用 JDBC 连接数据库

发布于 2024-10-15 23:56:34 字数 3310 浏览 0 评论 0 收藏 0

据估算,将近一半的软件开发都要涉及客户(机)/服务器方面的操作。Java 为自己保证的一项出色能力就是构建与平台无关的客户机/服务器数据库应用。在 Java 1.1 中,这一保证通过 Java 数据库连接(JDBC)实现了。

数据库最主要的一个问题就是各家公司之间的规格大战。确实存在一种“标准”数据库语言,即“结构查询语言”(SQL-92),但通常都必须确切知道自己要和哪家数据库公司打交道,否则极易出问题,尽管存在所谓的“标准”。JDBC 是面向“与平台无关”设计的,所以在编程的时候不必关心自己要使用的是什么数据库产品。然而,从 JDBC 里仍有可能发出对某些数据库公司专用功能的调用,所以仍然不可任性妄为。

和 Java 中的许多 API 一样,JDBC 也做到了尽量的简化。我们发出的方法调用对应于从数据库收集数据时想当然的做法:同数据库连接,创建一个语句并执行查询,然后处理结果集。

为实现这一“与平台无关”的特点,JDBC 为我们提供了一个“驱动程序管理器”,它能动态维护数据库查询所需的所有驱动程序对象。所以假如要连接由三家公司开发的不同种类的数据库,就需要三个单独的驱动程序对象。驱动程序对象会在装载时由“驱动程序管理器”自动注册,并可用 Class.forName() 强行装载。

为打开一个数据库,必须创建一个“数据库 URL”,它要指定下述三方面的内容:

(1) 用“jdbc”指出要使用 JDBC。

(2) “子协议”:驱动程序的名字或者一种数据库连接机制的名称。由于 JDBC 的设计从 ODBC 吸收了许多灵感,所以可以选用的第一种子协议就是“jdbc-odbc 桥”,它用“odbc”关键字即可指定。

(3) 数据库标识符:随使用的数据库驱动程序的不同而变化,但一般都提供了一个比较符合逻辑的名称,由数据库管理软件映射(对应)到保存了数据表的一个物理目录。为使自己的数据库标识符具有任何含义,必须用自己的数据库管理软件为自己喜欢的名字注册(注册的具体过程又随运行平台的不同而变化)。

所有这些信息都统一编译到一个字串里,即“数据库 URL”。举个例子来说,若想通过 ODBC 子协议同一个标识为“people”的数据库连接,相应的数据库 URL 可设为:

String dbUrl = "jdbc:odbc:people"

如果通过一个网络连接,数据库 URL 也需要包含对远程机器进行标识的信息。

准备好同数据库连接后,可调用静态方法 DriverManager.getConnection(),将数据库的 URL 以及进入那个数据库所需的用户名密码传递给它。得到的返回结果是一个 Connection 对象,利用它即可查询和操纵数据库。

下面这个例子将打开一个联络信息数据库,并根据命令行提供的参数查询一个人的姓(Last Name)。它只选择那些有 E-mail 地址的人的名字,然后列印出符合查询条件的所有人:

//: Lookup.java
// Looks up email addresses in a 
// local database using JDBC
import java.sql.*;

public class Lookup {
  public static void main(String[] args) {
    String dbUrl = "jdbc:odbc:people";
    String user = "";
    String password = "";
    try {
      // Load the driver (registers itself)
      Class.forName(
        "sun.jdbc.odbc.JdbcOdbcDriver");
      Connection c = DriverManager.getConnection(
        dbUrl, user, password);
      Statement s = c.createStatement();
      // SQL code:
      ResultSet r = 
        s.executeQuery(
          "SELECT FIRST, LAST, EMAIL " +
          "FROM people.csv people " +
          "WHERE " +
          "(LAST='" + args[0] + "') " +
          " AND (EMAIL Is Not Null) " +
          "ORDER BY FIRST");
      while(r.next()) {
        // Capitalization doesn't matter:
        System.out.println(
          r.getString("Last") + ", " 
          + r.getString("fIRST")
          + ": " + r.getString("EMAIL") );
      }
      s.close(); // Also closes ResultSet
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

可以看到,数据库 URL 的创建过程与我们前面讲述的完全一样。在该例中,数据库未设密码保护,所以用户名和密码都是空串。

用 DriverManager.getConnection() 建好连接后,接下来可根据结果 Connection 对象创建一个 Statement(语句)对象,这是用 createStatement() 方法实现的。根据结果 Statement,我们可调用 executeQuery(),向其传递包含了 SQL-92 标准 SQL 语句的一个字串(不久就会看到如何自动创建这类语句,所以没必要在这里知道关于 SQL 更多的东西)。

executeQuery() 方法会返回一个 ResultSet(结果集)对象,它与继承器非常相似:next() 方法将继承器移至语句中的下一条记录;如果已抵达结果集的末尾,则返回 null。我们肯定能从 executeQuery() 返回一个 ResultSet 对象,即使查询结果是个空集(也就是说,不会产生一个违例)。注意在试图读取任何记录数据之前,都必须调用一次 next()。若结果集为空,那么对 next() 的这个首次调用就会返回 false。对于结果集中的每条记录,都可将字段名作为字串使用(当然还有其他方法),从而选择不同的字段。另外要注意的是字段名的大小写是无关紧要的——SQL 数据库不在乎这个问题。为决定返回的类型,可调用 getString(),getFloat() 等等。到这个时候,我们已经用 Java 的原始格式得到了自己的数据库数据,接下去可用 Java 代码做自己想做的任何事情了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文