使用Java預處理實現JSON插入PostgreSQL

banq發表於2024-07-02

使用 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 資料。

相關文章