likes
comments
collection
share

[千字长文系列] 🌏玩转PostgreSql JDBC操作🦄(二)

作者站长头像
站长
· 阅读数 19

本文正在参加「技术专题19期 漫谈数据库技术」活动


本文使用的emoji🦄🧚‍♀️🧚🏻‍♀️🧚🏻‍♂️

🧚‍♀️JDBC查询PG数据

在本节中,我们将学习如何使用JDBC API从PostgreSQL数据库中的表查询数据。

通过以下几个步骤来使用JDBC查询表中的数据,:

  1. 建立PostgreSQL服务器数据库连接。

  2. 创建Statement对象(SQL语句对象)

  3. 执行sql语句,以获取ResultSet对象

  4. 处理ResultSet对象。

  5. 关闭数据库连接。

🧚🏻‍♀️建立数据库连接

要连接到PostgreSQL数据库,需要提供用户名、密码和数据库url等信息。

例如,以下方法连接到PostgreSQL数据库并返回连接对象:

    private final String url = "jdbc:p6spy:postgresql://localhost:5432/postgres";
    private final String user = "postgres";
    private final String password = "112233";


    /**
     * 连接PostgreSql数据库
     *
     * @return Connection
     * @throws SQLException
     */
    public Connection connect() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }

🧚🏻‍♀️JDBC Statement对象简介

Statement对象表示SQL语句。首先,从Connection对象创建Statement对象。然后,执行Statement对象以获取表示数据库结果集的ResultSet对象。

JDBC提供了三种语句对象:

  • Statement: 使用该对象实现简单无参的SQL语句。
  • PreparedStatement: 是Statement类的子类。可以执行带参数的SQL语句。
  • CallableStatement: 是PreparedStatement类的子类。扩展用于执行可能具有参数的存储过程的SQL语句

[千字长文系列] 🌏玩转PostgreSql JDBC操作🦄(二)

🧚🏻‍♀️执行查询方法

要执行查询,可以使用Statement对象的以下方法之一:

  • execute: 如果查询的第一个对象是ResultSet对象,则返回true。可以通过调用getResultSet方法来获取ResultSet。

  • executeQuery: 仅返回一个ResultSet对象。

  • executeUpdate: 返回受语句影响的行数。此方法用于插入,删除,或更新语句。

🧚🏻‍♀️处理ResultSet对象

获取ResultSet对象后,可以通过调用ResultSet对象使用下标的方法来遍历结果集。

请注意,此下标是Java下标,而不是数据库下标。

🧚🏻‍♀️关闭数据库连接

在JDBC 4.1中,可以使用try-with-resources语句自动关闭ResultSet、statement和Connection对象。

🧚🏻‍♀️查询数据示例

接下来,我们将向学习从简单到复杂查询数据的各种示例。

🧚🏻‍♂️Statement使用示例:使用返回一行的语句查询数据

以下方法返回COUNT()函数的

    /**
     * 查询表数据数量
     * @return
     */
    public int getTableCount() {
        String SQL = "SELECT count(*) FROM pro_rank";
        int count = 0;

        try (Connection conn = connect();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(SQL)) 
        {
            rs.next();
            count = rs.getInt(1);
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        return count;
    }

执行test方法,查询如下:

[千字长文系列] 🌏玩转PostgreSql JDBC操作🦄(二)

🧚🏻‍♂️Statement示例:使用返回多行的语句查询数据

以下getTableRows方法从pro_rank表中查询所有数据:

    /**
     * 查询表所有数据
     */
    public void getTableRows() {

        String SQL = "SELECT * FROM pro_rank";

        try (Connection conn = connect();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(SQL)) {
            System.out.println("name"+ "\t" + "team" + "\t" + "rank");
            // 打印所有数据
            while (rs.next()) {
                System.out.println(rs.getString("name") + "\t"
                        + rs.getString("team") + "\t"
                        + rs.getString("rank"));

            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

执行结果如下图

[千字长文系列] 🌏玩转PostgreSql JDBC操作🦄(二)

🧚🏻‍♂️PreparedStatement示例:使用具有参数的语句查询数据

要使用参数查询数据库,我们可以使用PreparedStatement。

首先,在SQL语句中使用问号 (?) 作为占位符。然后,使用PreparedStatement对象的方法 (如setInt、setString等) 将值传递给占位符。

以下为方法示例:

    /**
     * 通过战队名查询队员
     *
     * @param team
     */
    public void findProByTeam(String team) {
        String SQL = "SELECT *"
                + "FROM pro_rank "
                + "WHERE team = ? ";

        try (Connection conn = connect();
             PreparedStatement pstmt = conn.prepareStatement(SQL))
        {
            pstmt.setString(1, team);
            ResultSet rs = pstmt.executeQuery();
            // 打印所有数据
            System.out.println("name"+ "\t" + "team" );
            while (rs.next()) {
                System.out.println(rs.getString("name") + "\t"
                        + rs.getString("team") );
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

执行结果如下所示

[千字长文系列] 🌏玩转PostgreSql JDBC操作🦄(二)

🧚‍♀️JDBC向PG表中插入数据

本节将学习如何使用JDBC API将数据插入PostgreSQL数据库的表中。

为了演示,我们将使用之前一直用到的pro_rank表。

🧚🏻‍♀️向表中插入一行

要将行插入表中,请按照以下步骤操作:

当我们在表中插入一行具有自动生成的id,我们通常希望取回id值以进行进一步处理。

要获取自动生成的id:

  • 通过添加Statement.RETURN_GENERATED_KEY来创建Statement对象,以获取Sql执行结果返回值

  • 调用Statement对象的getGeneratedKeys()方法获取新增数据的id值。

以下代码为插入一条数据到pro_rank表的示例

    /**
     * 插入一条数据到表中
     * @param proRank
     * @return
     */
    public long insertOneRow(ProRank proRank) {
        String SQL = "INSERT INTO pro_rank(name,team,line,rank)"
                + "VALUES(?,?,?,?)";

        long id = 0;

        try (Connection conn = connect();
                PreparedStatement pstmt = conn.prepareStatement(SQL,
                Statement.RETURN_GENERATED_KEYS)) {

            pstmt.setString(1, proRank.getName());
            pstmt.setString(2, proRank.getTeam());
            pstmt.setString(3, proRank.getLine());
            pstmt.setInt(4, proRank.getRank());

            int affectedRows = pstmt.executeUpdate();
            // 判断生效列
            if (affectedRows > 0) {
                // 获取返回的id
                try (ResultSet rs = pstmt.getGeneratedKeys()) {
                    if (rs.next()) {
                        id = rs.getLong(1);
                    }
                } catch (SQLException e) {
                    System.out.println(e.getMessage());
                    e.printStackTrace();
                }
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        return id;
    }

运行结果如下所示:

[千字长文系列] 🌏玩转PostgreSql JDBC操作🦄(二)

🧚🏻‍♀️向表中插入多行

向表中插入多行的步骤如下:

  1. 创建数据库连接。

  2. 创建一个Statement对象。

  3. 调用addBatch()方法。

  4. 调用executeBatch()方法提交插入批处理。

  5. 关闭数据库连接。

以下是代码示例

    /**
     * 插入多行
     */
    public void insertMultRows(List<ProRank> list) {
        String SQL = "INSERT INTO pro_rank(name,team,line,rank)"
                + "VALUES(?,?,?,?)";
        try (
                Connection conn = connect();
                PreparedStatement statement = conn.prepareStatement(SQL);) {
            int count = 0;

            for (ProRank proRank : list) {
                statement.setString(1, proRank.getName());
                statement.setString(2, proRank.getTeam());
                statement.setString(3, proRank.getLine());
                statement.setInt(4, proRank.getRank());
                statement.addBatch();
                count++;
            }
            System.out.println("插入" + count + "行数据");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

执行结果如下:

[千字长文系列] 🌏玩转PostgreSql JDBC操作🦄(二)

未完待续..既然看到这里了,不妨来个大大的点赞吧[千字长文系列] 🌏玩转PostgreSql JDBC操作🦄(二)