PostgreSQL Java 教程: 从 PostgreSQL 查询数据

八月 9, 2023

摘要:在本教程中,您将学习如何使用 JDBC API 从 PostgreSQL 数据库中的表中查询数据。

要使用 JDBC 从表中查询数据,请使用以下步骤:

  1. 建立与 PostgreSQL 服务器的数据库连接
  2. 创建 Statement 对象的实例。
  3. 执行语句以获取结果集对象。
  4. 处理结果集对象。
  5. 关闭数据库连接。

建立数据库连接

若要连接到 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:返回受语句影响的行数。可将此方法用于 INSERTDELETEUPDATE 语句。

处理结果集对象

获得 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 方法中完成了以下操作:

  1. 首先,准备一个 SQL 语句来计算 actor 表中的行数。
  2. 其次,建立与数据库的连接,创建一个 Statement 对象,然后执行查询。
  3. 第三,通过将游标移动到第一行来处理结果集,并使用 getInt() 方法获取其值。

下面演示了该方法的输出。

postgresql jdbc select count

使用返回多行的语句查询数据

下面的 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"));

        }
    }

postgresql jdbc select example

使用带有参数的语句查询数据

若要使用参数查询数据库,请使用 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());
        }
    }

postgresql jdbc select with parameters

您可以在下面下载本教程的完整源代码:

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 数据库中查询数据。