1. 简介

在现代软件开发中,JSON数据因其轻量级和通用性已成为标配。PostgreSQL凭借强大的JSON支持,为存储和查询JSON数据提供了优秀平台。作为主流编程语言,Java通常通过JDBC与数据库交互。本文将演示如何使用Java的PreparedStatement将JSON对象插入PostgreSQL数据库

2. 依赖配置

开始写代码前,需要先搭建环境。除了安装运行PostgreSQL,还需在项目中添加PostgreSQL JDBC驱动和org.json库。

2.1 安装并运行PostgreSQL

若未安装PostgreSQL,可从官网下载安装。PostgreSQL从9版本开始就支持JSON,本文使用最新稳定版PostgreSQL 16。确保服务已启动且能用指定凭据访问。

2.2 添加PostgreSQL JDBC驱动

在项目中添加PostgreSQL JDBC驱动依赖。Maven项目需在pom.xml中添加以下依赖

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

2.3 添加JSON库依赖

处理JSON数据需引入JSON库。Java主流选择包括Jackson、Gson和org.json。本文使用轻量级的org.json库,在Maven项目的pom.xml中添加以下依赖

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

依赖配置完成后,接下来创建数据表并编写Java代码插入JSON数据。

3. JSONB vs JSON类型对比

PostgreSQL提供两种JSON存储类型:JSONB和JSON。两者虽都用于存储操作JSON数据,但存在关键差异:

JSONB类型特点:

  • ✅ 采用二进制存储,支持高效索引
  • ✅ 查询性能更优
  • ✅ 插入时自动验证和转换数据
  • ✅ 保留JSON对象内键的顺序
  • ✅ PostgreSQL自动转换其他数据类型为JSONB

JSON类型特点:

  • ❌ 以纯文本形式存储,无二进制优化
  • ❌ 不支持专用索引
  • ❌ 仅插入时验证数据
  • ❌ 不保留键顺序
  • ❌ 需要显式类型转换

本文将使用JSONB类型存储和查询JSON数据。

4. 创建含JSON列的PostgreSQL表

首先创建包含JSON列的PostgreSQL表。连接到之前配置的PostgreSQL实例,执行以下SQL命令:

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

该表包含三列:id(自增主键)、name(字符串)和info(JSONB类型)。JSONB列以二进制格式存储JSON数据,提供高效的存储和查询能力。

5. 编写Java代码插入JSON数据

现在进入Java部分,我们将编写使用PreparedStatement向users表插入JSON数据的程序。

5.1 建立数据库连接

首先建立JDBC连接:

public class InsertJsonData {
    private static final String URL = "jdbc:postgresql://localhost:5432/mydatabase";
    private static final String USER = "admin";
    private static final String PASSWORD = "securepassword123";

    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}

⚠️ 注意:需将mydatabaseadminsecurepassword123替换为实际的PostgreSQL数据库名、用户名和密码。

5.2 插入JSON数据

编写向users表插入JSON对象的方法:

public class InsertJsonData {
    public static void insertUser(String name, JSONObject info) throws SQLException {
        String sql = "INSERT INTO users (name, info) VALUES (?, ?::jsonb)";

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setString(1, name);
            pstmt.setString(2, info.toString());
            pstmt.executeUpdate();
            
            System.out.println("数据插入成功");
        }
    }

    public static void main(String[] args) throws SQLException {
        JSONObject jsonInfo = new JSONObject();
        jsonInfo.put("email", "john.doe@example.com");
        jsonInfo.put("age", 30);
        jsonInfo.put("active", true);

        insertUser("张三", jsonInfo);
    }
}

5.3 代码解析

拆解关键代码组件:

  • 数据库连接getConnection()方法建立PostgreSQL连接
  • SQL语句INSERT INTO users (name, info) VALUES (?, ?::jsonb)
    • ?::jsonb是PostgreSQL特有的类型转换语法
    • 双冒号::等同于CAST关键字,表示类型转换
    • 通过?::jsonb指示PostgreSQL将第二个参数(JSON字符串)转换为JSONB类型
  • PreparedStatement:设置参数并执行SQL
    • pstmt.setString(1, name)设置用户名
    • pstmt.setString(2, info.toString())设置JSON数据
  • JSON处理:使用org.json库的JSONObject创建和操作JSON数据

6. 总结

使用Java的PreparedStatement向PostgreSQL插入JSON对象简单高效。这种方法结合了PostgreSQL强大的JSON功能和Java成熟的JDBC API。按本文步骤操作,可轻松在PostgreSQL中存储JSON数据并利用其丰富的查询特性。

如果偏好使用JPA进行数据库操作,可参考使用Spring Boot和JPA存储PostgreSQL JSONB数据的替代方案。

完整源码可在GitHub获取。


原始标题:Insert JSON Object into PostgreSQL using Java preparedStatement | Baeldung