此Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及后续版本中更新的语言功能的摘要。
请参阅JDK发行说明,了解有关所有JDK发行版的新功能、增强功能以及已删除或不推荐使用选项的信息。
通常,使用JDBC处理任何SQL语句,您需要按照以下步骤进行:
本页使用教程示例中的方法CoffeesTable.viewTable来演示这些步骤。该方法输出表COFFEES的内容。稍后在本教程中将对该方法进行更详细的讨论:
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);
}
}
首先,与您要使用的数据源建立连接。数据源可以是数据库管理系统(DBMS)、传统文件系统或其他带有相应JDBC驱动程序的数据源。此连接由Connection对象表示。有关更多信息,请参见建立连接。
Statement是表示SQL语句的接口。您可以执行Statement对象,它们会生成ResultSet对象,这是表示数据库结果集的数据表。要创建Statement对象,您需要一个Connection对象。
例如,CoffeesTable.viewTable使用以下代码创建Statement对象:
stmt = con.createStatement();
有三种不同类型的语句:
Statement:用于执行没有参数的简单SQL语句。PreparedStatement:(扩展Statement。)用于预编译可能包含输入参数的SQL语句。有关更多信息,请参见使用预编译语句。CallableStatement:(扩展PreparedStatement。)用于执行可能包含输入和输出参数的存储过程。有关更多信息,请参见存储过程。要执行查询,请从Statement调用一个execute方法,如下所示:
execute:如果查询返回的第一个对象是ResultSet对象,则返回true。如果查询可能返回一个或多个ResultSet对象,请使用此方法。通过多次调用Statement.getResultSet来检索查询返回的ResultSet对象。executeQuery:返回一个ResultSet对象。executeUpdate:返回一个表示受SQL语句影响的行数的整数。如果使用INSERT、DELETE或UPDATE SQL语句,请使用此方法。例如,CoffeesTable.viewTable使用以下代码执行了一个Statement对象:
ResultSet rs = stmt.executeQuery(query);
有关更多信息,请参阅从结果集中检索和修改值。
您可以通过光标访问ResultSet对象中的数据。请注意,这个光标不是数据库光标。这个光标是一个指向ResultSet对象中一行数据的指针。初始时,光标位于第一行之前。您可以调用ResultSet对象中定义的各种方法来移动光标。
例如,CoffeesTable.viewTable重复调用ResultSet.next方法将光标向前移动一行。每次调用next方法时,该方法输出光标当前所在行的数据:
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);
}
// ...
有关更多信息,请参阅从结果集中检索和修改值。
当您使用完Connection、Statement或ResultSet对象后,请调用其close方法立即释放其正在使用的资源。
或者,可以使用try-with-resources语句自动关闭Connection、Statement和ResultSet对象,无论是否抛出SQLException。(当JDBC在与数据源交互期间遇到错误时,会抛出SQLException。有关更多信息,请参阅处理SQL异常。)自动资源语句由一个try语句和一个或多个声明的资源组成。例如,CoffeesTable.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教程中的The try-with-resources Statement。