八月 9, 2023
摘要:在本教程中,您将学习如何使用 JDBC API 从 PostgreSQL 数据库中的表中查询数据。
目录
要使用 JDBC 从表中查询数据,请使用以下步骤:
- 建立与 PostgreSQL 服务器的数据库连接。
- 创建 Statement 对象的实例。
- 执行语句以获取结果集对象。
- 处理结果集对象。
- 关闭数据库连接。
建立数据库连接
若要连接到 PostgreSQL 数据库,需要提供账号信息,例如用户名、密码和连接字符串。有关详细信息,请参阅连接到 PostgreSQL 数据库服务器。
例如,以下方法连接到 PostgreSQL 数据库并返回一个连接对象:
/**
* Connect to the PostgreSQL database
*
* @return a Connection object
* @throws java.sql.SQLException
*/
public Connection connect() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
连接地址、用户和密码如下:
private final String url = "jdbc:postgresql://localhost/dvdrental";
private final String user = "postgres";
private final String password = "postgres";
创建 Statement 对象
Statement 对象用于表示 SQL 语句。首先,从连接对象创建一个 Statement 对象。然后,执行 Statement 对象以获取表示数据库结果集的 ResultSet 对象。
JDBC 为您提供了三种类型的 Statement 对象:
- Statement:使用该 Statement 实现没有参数的简单 SQL 语句。
- PreparedStatement:它是 Statement 类的子类。它使您能够将参数添加到 SQL 语句中。
- CallableStatement:扩展的 PreparedStatement 类,用于执行可能带有参数的存储过程。
执行查询
若要执行查询,请使用 Statement 对象的下列方法之一:
- execute:如果查询的第一个对象是 ResultSet 对象,则返回 true。可以通过调用方法 getResultSet 来获取结果集。
- executeQuery:只返回一个 ResultSet 对象。
- executeUpdate:返回受语句影响的行数。可将此方法用于 INSERT、 DELETE 或 UPDATE 语句。
处理结果集对象
获得 ResultSet 对象后,可以使用游标通过调用 ResultSet 对象的方法循环访问结果集。
请注意,此游标是 Java 游标,而不是数据库游标。
关闭数据库连接
在 JDBC 4.1 中,您可以使用 try-with-resources 形式的语句自动关闭结果集、语句和连接对象。
查询数据示例
在下一节中,我们将向您展示从简单到复杂的查询数据的各种示例。
使用返回一行的语句查询数据
以下方法使用 COUNT 函数返回actor
表中的演员数。
/**
* Get actors count
* @return
*/
public int getActorCount() {
String SQL = "SELECT count(*) FROM actor";
int count = 0;
try (Connection conn = connect();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(SQL)) {
rs.next();
count = rs.getInt(1);
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
return count;
}
我们在 getActorCount 方法中完成了以下操作:
- 首先,准备一个 SQL 语句来计算 actor 表中的行数。
- 其次,建立与数据库的连接,创建一个 Statement 对象,然后执行查询。
- 第三,通过将游标移动到第一行来处理结果集,并使用 getInt() 方法获取其值。
下面演示了该方法的输出。
使用返回多行的语句查询数据
下面的 getActors 方法从 actor 表中查询数据并显示演员的信息。
/**
* Get all rows in the actor table
*/
public void getActors() {
String SQL = "SELECT actor_id,first_name, last_name FROM actor";
try (Connection conn = connect();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(SQL)) {
// display actor information
displayActor(rs);
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
在 displayActor 方法中,我们循环遍历结果集并打印出每一行的信息。
/**
* Display actor
*
* @param rs
* @throws SQLException
*/
private void displayActor(ResultSet rs) throws SQLException {
while (rs.next()) {
System.out.println(rs.getString("actor_id") + "\t"
+ rs.getString("first_name") + "\t"
+ rs.getString("last_name"));
}
}
使用带有参数的语句查询数据
若要使用参数查询数据库,请使用 PreparedStatement 对象。
首先,在 SQL 语句中使用问号 (?) 作为占位符。然后,使用 PreparedStatement 对象的方法,如 setInt、setString、… 将值传递给占位符。
下面的方法允许您通过他/她的 id 查找演员。
/**
* Find actor by his/her ID
*
* @param actorID
*/
public void findActorByID(int actorID) {
String SQL = "SELECT actor_id,first_name,last_name "
+ "FROM actor "
+ "WHERE actor_id = ?";
try (Connection conn = connect();
PreparedStatement pstmt = conn.prepareStatement(SQL)) {
pstmt.setInt(1, actorID);
ResultSet rs = pstmt.executeQuery();
displayActor(rs);
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
您可以在下面下载本教程的完整源代码:
package net.rockdata.tutorial;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
*
* @author rockdata.net
*/
public class Main {
private final String url = "jdbc:postgresql://localhost/dvdrental";
private final String user = "postgres";
private final String password = "postgres";
/**
* Connect to the PostgreSQL database
*
* @return a Connection object
* @throws java.sql.SQLException
*/
public Connection connect() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
/**
* Get all rows in the actor table
*/
public void getActors() {
String SQL = "SELECT actor_id,first_name, last_name FROM actor";
try (Connection conn = connect();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(SQL)) {
// display actor information
displayActor(rs);
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
/**
* Get actors count
* @return
*/
public int getActorCount() {
String SQL = "SELECT count(*) FROM actor";
int count = 0;
try (Connection conn = connect();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(SQL)) {
rs.next();
count = rs.getInt(1);
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
return count;
}
/**
* Display actor
*
* @param rs
* @throws SQLException
*/
private void displayActor(ResultSet rs) throws SQLException {
while (rs.next()) {
System.out.println(rs.getString("actor_id") + "\t"
+ rs.getString("first_name") + "\t"
+ rs.getString("last_name"));
}
}
/**
* Find actor by his/her ID
*
* @param actorID
*/
public void findActorByID(int actorID) {
String SQL = "SELECT actor_id,first_name,last_name "
+ "FROM actor "
+ "WHERE actor_id = ?";
try (Connection conn = connect();
PreparedStatement pstmt = conn.prepareStatement(SQL)) {
pstmt.setInt(1, actorID);
ResultSet rs = pstmt.executeQuery();
displayActor(rs);
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Main main = new Main();
main.findActorByID(200);
}
}
在本教程中,我们向您展示了如何使用 JDBC API 从 PostgreSQL 数据库中查询数据。