此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。