使用Java预处理实现JSON插入PostgreSQL

使用 Java 的PreparedStatement将 JSON 对象插入 PostgreSQL既简单又高效。这种方法利用了 PostgreSQL 强大的 JSON 功能和 Java 强大的 JDBC API。按照本文概述的步骤,我们可以无缝地将 JSON 数据存储在我们的 PostgreSQL 数据库中,并利用其丰富的查询功能。

在现代软件开发中,由于 JSON 数据轻量且用途广泛,因此处理 JSON 数据已变得无处不在。PostgreSQL 对 JSON 具有强大的支持,为存储和查询 JSON 数据提供了一个出色的平台。作为一种流行的编程语言,Java 经常使用 JDBC 与数据库交互。本文演示如何使用 Java 的PreparedStatement将 JSON 对象插入 PostgreSQL 数据库。

JSONB 与 JSON 类型
PostgreSQL 提供了两种存储 JSON 数据的主要类型:JSONB和JSON。虽然两种类型都用于存储和操作 JSON 数据,但它们之间存在一些差异。

JSONB类型提供高效的二进制存储和索引功能,从而加快查询执行速度。它在插入期间执行 JSON 数据的验证和转换,从而保留 JSON 对象内键的顺序。PostgreSQL 可以自动将其他数据类型的值转换为JSON。

另一方面,JSON类型将 JSON 数据存储为纯文本,没有二进制表示或专门的索引。它在插入期间执行验证,但缺少JSONB的优化和键顺序保存。使用JSONB类型时,需要显式强制转换或转换才能将值转换为 JSON  。

在本文中,我们将利用JSONB类型在 PostgreSQL 中存储和查询 JSON 数据。

安装并运行 PostgreSQL
如果未安装 PostgreSQL,我们可以从PostgreSQL官方网站下载并安装它。考虑到 PostgreSQL 已经支持 JSON 很长时间了,我们可以从 PostgreSQL 9 开始选择任何版本。在本文中,我们将使用最新、最稳定的版本,即 PostgreSQL 16。我们需要确保 PostgreSQL 已启动并运行,并且可以使用必要的凭据访问。

包含 PostgreSQL JDBC 驱动
将 PostgreSQL JDBC 驱动程序添加到我们项目的依赖项中。对于 Maven 项目,我们需要在pom.xml中指定依赖项:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.7.3</version>
</dependency>


 包含 JSON 库依赖
为了在 Java 代码中使用 JSON 数据,我们还需要将 JSON 库作为依赖项包含在内。Java 有几种流行的 JSON 库,例如Jackson、Gson和org.json。在本文中,我们将使用org.json库,它提供了一个简单而轻量级的 JSON 处理解决方案。为了将org.json库包含在我们的项目中,我们可以将以下依赖项添加到 Maven 项目的 pom.xml 文件中:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20240303</version>
</dependency>

现在我们已经有了必要的依赖项,让我们继续下一部分,创建表并编写 Java 代码来插入 JSON 数据。


创建带有 JSON 列的 PostgreSQL 表
首先,我们需要创建一个包含 JSON 列的 PostgreSQL 表。连接到我们之前设置的 PostgreSQL 实例并运行以下 SQL 命令:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    info JSONB
);

该表有三列:id,name,info。info列为JSONB类型,以二进制格式存储 JSON 数据,提供高效的存储和查询能力。

编写 Java 代码插入 JSON 数据
现在,让我们转到 Java 部分。我们将编写一个 Java 程序,使用PreparedStatement将 JSON 数据插入到用户表中。

建立数据库连接
首先,我们需要建立与 PostgreSQL 数据库的 JDBC 连接。以下是获取数据库连接的方法:

public class InsertJsonData {
    private static final String URL = "jdbc:postgresql://localhost:5432/database_name";
    private static final String USER = "username";
    private static final String PASSWORD = "password";
    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}

请注意,database_name、username和password需要替换为实际的 PostgreSQL 数据库名称、用户名和密码。

插入 JSON 数据
接下来,我们需要编写一个方法将 JSON 对象插入到用户 表中:

public class InsertJsonData {
    public static void insertUser(String name, JSONObject info) {
        String sql = "INSERT INTO users (name, info) VALUES (?, ?::jsonb)";
        Connection conn = DatabaseConnection.getConnection();
        PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, name);
        pstmt.setString(2, info.toString());
        pstmt.executeUpdate();
        System.out.println("Data inserted successfully.");
    }
    public static void main(String[] args) {
        JSONObject jsonInfo = new JSONObject();
        jsonInfo.put("email", "john.doe@example.com");
        jsonInfo.put("age", 30);
        jsonInfo.put("active", true);
        insertUser("John Doe", jsonInfo);
    }
}

代码分解
让我们分解代码并探索它的一些组件:

  • 数据库连接:getConnection()方法建立与 PostgreSQL 数据库的连接。
  • SQL 查询:INSERT INTO users (name, info) VALUES (?, ?::jsonb)查询将记录插入到users表中。?::jsonb语法是用于类型转换的 PostgreSQL 特定语法。双冒号运算符 :: 是 PostgreSQL 中CAST关键字的同义词,表示类型转换操作。通过使用?::jsonb,我们指示 PostgreSQL 将第二个参数(JSON 字符串)转换为jsonb数据类型,然后再将其插入info列。这允许在 PostgreSQL 中正确处理和存储 JSON 数据。
  • PreparedStatement:PreparedStatement设置参数并执行 SQL 查询。pstmt.setString (1, name)设置名称,pstmt.setString(2, info.toString())设置 JSON 数据。
  • JSON 处理:org.json 库中的JSONObject类创建并处理 JSON 数据。