使用 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 语句影响的行数。如果您使用INSERT
,DELETE
或UPDATE
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 语句自动关闭Connection
,Statement
和ResultSet
对象,而不管是否已抛出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 语句。