JDBC:查询数据库
查询数据库意味着搜索其数据。这样做是将SQL语句发送到数据库。为此,我们首先需要一个开放的数据库连接。打开连接后,需要创建一个" Statement"对象,如下所示:
Statement statement = connection.createStatement();
创建Statement
之后,就可以使用它执行SQL查询,如下所示:
String sql = "select * from people"; ResultSet result = statement.executeQuery(sql);
当执行SQL查询时,我们将返回一个" ResultSet"。 ResultSet
包含SQL查询的结果。结果将返回包含数据列的行。我们可以像这样对ResultSet
的行进行迭代:
while(result.next()) { String name = result.getString("name"); long age = result.getLong ("age"); }
如果有更多行,则ResultSet.next()
方法将移至ResultSet
中的下一行。如果有更多行,则返回true。如果没有更多行,它将返回false。
我们需要至少调用一次" next()",然后才能读取任何数据。在第一个" next()"调用之前," ResultSet"位于第一行之前。
我们可以通过调用某些getXXX()方法(其中XXX是原始数据类型)来获取当前行的列数据。例如:
result.getString ("columnName"); result.getLong ("columnName"); result.getInt ("columnName"); result.getDouble ("columnName"); result.getBigDecimal("columnName"); etc.
获取值的列名作为参数传递给任何" getXXX()"方法调用中的任何一个。
我们也可以改为传递该列的索引,如下所示:
result.getString (1); result.getLong (2); result.getInt (3); result.getDouble (4); result.getBigDecimal(5); etc.
为此,我们需要知道给定列在" ResultSet"中具有什么索引。我们可以通过调用ResultSet.findColumn()
方法来获取给定列的索引,如下所示:
int columnIndex = result.findColumn("columnName");
如果要迭代大量的行,则按其索引引用列可能比按其名称引用要快。
完成" ResultSet"的迭代后,我们需要同时关闭" ResultSet"和创建它的" Statement"对象(如果完成的话)。我们可以通过调用它们的close()
方法来实现,如下所示:
result.close(); statement.close();
当然,我们应该在" finally"块中调用这些方法,以确保即使在" ResultSet"迭代期间发生异常时也可以调用它们。
完整的例子
这是完整的查询代码示例:
Statement statement = connection.createStatement(); String sql = "select * from people"; ResultSet result = statement.executeQuery(sql); while(result.next()) { String name = result.getString("name"); long age = result.getLong("age"); System.out.println(name); System.out.println(age); } result.close(); statement.close();
这里的例子再次出现,添加了" try-finally"块。注意,我省略了catch
块以简化示例。
Statement statement = null; try{ statement = connection.createStatement(); ResultSet result = null; try{ String sql = "select * from people"; ResultSet result = statement.executeQuery(sql); while(result.next()) { String name = result.getString("name"); long age = result.getLong("age"); System.out.println(name); System.out.println(age); } } finally { if(result != null) result.close(); } } finally { if(statement != null) statement.close(); }