使用 JDBC 处理 SQL 语句

通常,要使用 JDBC 处理任何 SQL 语句,请按照以下步骤操作:

此页面使用教程示例中的以下方法CoffeesTables.viewTable来演示这些步骤。此方法输出表COFFEES的内容。此方法将在本教程的后面部分详细讨论:

public static void viewTable(Connection con, String dbName)
    throws SQLException {

    Statement stmt = null;
    String query = "select COF_NAME, SUP_ID, PRICE, " +
                   "SALES, TOTAL " +
                   "from " + dbName + ".COFFEES";
    try {
        stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(query);
        while (rs.next()) {
            String coffeeName = rs.getString("COF_NAME");
            int supplierID = rs.getInt("SUP_ID");
            float price = rs.getFloat("PRICE");
            int sales = rs.getInt("SALES");
            int total = rs.getInt("TOTAL");
            System.out.println(coffeeName + "\t" + supplierID +
                               "\t" + price + "\t" + sales +
                               "\t" + total);
        }
    } catch (SQLException e ) {
        JDBCTutorialUtilities.printSQLException(e);
    } finally {
        if (stmt != null) { stmt.close(); }
    }
}

Establishing Connections

首先,与您要使用的数据源构建连接。数据源可以是 DBMS,旧文件系统或具有相应 JDBC 驱动程序的其他数据源。此连接由Connection对象表示。有关更多信息,请参见构建连接

Creating 语句

Statement是表示 SQL 语句的interface。您执行Statement个对象,它们生成ResultSet个对象,这是一个表示数据库结果集的数据表。您需要一个Connection对象才能创建Statement对象。

例如,CoffeesTables.viewTable使用以下代码创建Statement对象:

stmt = con.createStatement();

有三种不同的语句:

  • Statement:用于实现不带参数的简单 SQL 语句。

  • PreparedStatement :(extensionsStatement.)用于预编译可能包含 Importing 参数的 SQL 语句。有关更多信息,请参见使用准备好的语句

  • CallableStatement:(extensionsPreparedStatement)。用于执行可能包含 Importing 和输出参数的存储过程。有关更多信息,请参见Stored Procedures

Executing Queries

要执行查询,请从Statement调用execute方法,例如:

  • execute:如果查询返回的第一个对象是ResultSet对象,则返回true。如果查询可以返回一个或多个ResultSet对象,请使用此方法。通过重复调用Statement.getResultSet来检索从查询返回的ResultSet对象。

  • executeQuery:返回一个ResultSet对象。

  • executeUpdate:返回一个整数,该整数表示受 SQL 语句影响的行数。如果您使用INSERTDELETEUPDATE SQL 语句,请使用此方法。

例如,CoffeesTables.viewTable使用以下代码执行了Statement对象:

ResultSet rs = stmt.executeQuery(query);

有关更多信息,请参见从结果集中检索和修改值

处理 ResultSet 对象

您可以通过游标访问ResultSet对象中的数据。请注意,此游标不是数据库游标。该光标是一个指向ResultSet对象中的一行数据的指针。最初,光标位于第一行之前。您调用ResultSet对象中定义的各种方法来移动光标。

例如,CoffeesTables.viewTable反复调用方法ResultSet.next将光标向前移动一行。每次调用next时,该方法将数据输出到光标当前所在的行中:

try {
    stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next()) {
        String coffeeName = rs.getString("COF_NAME");
        int supplierID = rs.getInt("SUP_ID");
        float price = rs.getFloat("PRICE");
        int sales = rs.getInt("SALES");
        int total = rs.getInt("TOTAL");
        System.out.println(coffeeName + "\t" + supplierID +
                           "\t" + price + "\t" + sales +
                           "\t" + total);
    }
}
// ...

有关更多信息,请参见从结果集中检索和修改值

Closing Connections

完成使用Statement后,调用方法Statement.close以立即释放其使用的资源。当您调用此方法时,其ResultSet对象将关闭。

例如,方法CoffeesTables.viewTable通过将其包装在finally块中,可确保在方法结束时关闭Statement对象,而不考虑抛出了任何SQLException对象:

} finally {
    if (stmt != null) { stmt.close(); }
}

JDBC 在与数据源进行交互时遇到错误时,将引发SQLException。有关更多信息,请参见处理 SQL 异常

在 Java SE 发行版 7 和更高版本中可用的 JDBC 4.1 中,可以使用 try-with-resources 语句自动关闭ConnectionStatementResultSet对象,而不管是否已抛出SQLException。自动资源语句由try语句和一个或多个声明的资源组成。例如,您可以修改CoffeesTables.viewTable使其Statement对象自动关闭,如下所示:

public static void viewTable(Connection con) throws SQLException {

    String query = "select COF_NAME, SUP_ID, PRICE, " +
                   "SALES, TOTAL " +
                   "from COFFEES";

    try (Statement stmt = con.createStatement()) {

        ResultSet rs = stmt.executeQuery(query);

        while (rs.next()) {
            String coffeeName = rs.getString("COF_NAME");
            int supplierID = rs.getInt("SUP_ID");
            float price = rs.getFloat("PRICE");
            int sales = rs.getInt("SALES");
            int total = rs.getInt("TOTAL");
            System.out.println(coffeeName + ", " + supplierID +
                               ", " + price + ", " + sales +
                               ", " + total);
        }
    } catch (SQLException e) {
        JDBCTutorialUtilities.printSQLException(e);
    }
}

以下语句是try -with-resources 语句,它声明一个资源stmt,该资源将在try块终止时自动关闭:

try (Statement stmt = con.createStatement()) {
    // ...
}

有关更多信息,请参见Essential Classes跟踪中的try-with-resources 语句