# 使用 JDBC 处理 SQL 语句

> 原文： [https://docs.oracle.com/javase/tutorial/jdbc/basics/processingsqlstatements.html](https://docs.oracle.com/javase/tutorial/jdbc/basics/processingsqlstatements.html)

通常，要使用 JDBC 处理任何 SQL 语句，请执行以下步骤：

1.  [建立连接。](#establishing_connections)
2.  [创建一个声明。](#creating_statements)
3.  [执行查询。](#executing_queries)
4.  [处理`ResultSet`对象。](#processing_resultset_objects)
5.  [关闭连接。](#closing_connections)

本页使用以下方法， `[CoffeesTables.viewTable](gettingstarted.html)`，从教程示例中演示这些步骤。此方法输出表`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(); }
    }
}

```

首先，与要使用的数据源建立连接。数据源可以是 DBMS，遗留文件系统或具有相应 JDBC 驱动程序的某些其他数据源。此连接由`Connection`对象表示。有关详细信息，请参阅[建立连接](connecting.html)。

`Statement`是表示 SQL 语句的接口。执行`Statement`对象，它们生成`ResultSet`对象，这是表示数据库结果集的数据表。您需要`Connection`对象来创建`Statement`对象。

例如，`CoffeesTables.viewTable`使用以下代码创建`Statement`对象：

```
stmt = con.createStatement();

```

有三种不同的陈述：

*   `Statement`：用于实现没有参数的简单 SQL 语句。
*   `PreparedStatement` :(扩展`Statement`。）用于预编译可能包含输入参数的 SQL 语句。有关详细信息，请参阅[使用准备语句](prepared.html)。
*   `CallableStatement:`（扩展`PreparedStatement`。）用于执行可能包含输入和输出参数的存储过程。有关详细信息，请参阅[存储过程](storedprocedures.html)。

要执行查询，请从`Statement`调用`execute`方法，如下所示：

*   `execute`：如果查询返回的第一个对象是`ResultSet`对象，则返回`true`。如果查询可以返回一个或多个`ResultSet`对象，请使用此方法。通过重复调用`Statement.getResultSet`来检索从查询返回的`ResultSet`对象。
*   `executeQuery`：返回一个`ResultSet`对象。
*   `executeUpdate`：返回一个整数，表示受 SQL 语句影响的行数。如果使用`INSERT`，`DELETE`或`UPDATE` SQL 语句，请使用此方法。

例如，`CoffeesTables.viewTable`使用以下代码执行`Statement`对象：

```
ResultSet rs = stmt.executeQuery(query);

```

有关详细信息，请参阅[从结果集](retrieving.html)中检索和修改值。

您可以通过游标访问`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);
    }
}
// ...

```

有关详细信息，请参阅[从结果集](retrieving.html)中检索和修改值。

使用完`Statement`后，调用`Statement.close`方法立即释放正在使用的资源。调用此方法时，其`ResultSet`对象将关闭。

例如，方法`CoffeesTables.viewTable`通过将`finally`块包装在`finally`块中，确保`Statement`对象在方法结束时关闭，无论抛出任何`SQLException`对象如何：

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

```

JDBC 在与数据源交互期间遇到错误时会抛出`SQLException`。有关更多信息，请参见[处理 SQL 异常](sqlexception.html)。

在 Java SE 7 及更高版本中可用的 JDBC 4.1 中，无论`SQLException`是否具有`SQLException`，您都可以使用 try-with-resources 语句自动关闭`Connection`，`Statement`和`ResultSet`对象。被抛出自动资源语句由`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/exceptions/tryResourceClose.html) [基本类](../../essential/index.html)跟踪中的`try` - with-resources 语句。