トッカンソフトウェア

JavaからJDBCでPostgreSQLにアクセス(JSONB)

今回はJavaからJDBCでJSONBの項目にアクセスします。テーブルは前回に作成したものを使います。
PostgreSQLでJSON操作についても前回を参照して下さい。


				
package javaPosgre;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JsonbTest {
	public static void main(String[] args) throws SQLException {
		Connection conn = null;
		try {
			// クラスのロード
			Class.forName("org.postgresql.Driver");

			// コネクションの取得
			conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "ps");

			// INSERTのテスト
			insertTest(conn);

			// UPDATEのテスト
			updateTest(conn);

			// SELECTのテスト
			selectTest(conn);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (conn != null) {
				conn.close();
			}
		}
	}

	/**
	 * データ追加テスト
	 * 
	 * @param conn コネクション
	 * @throws Exception
	 * @throws SQLException SQL例外
	 */
	private static void insertTest(Connection conn) throws Exception {
		PreparedStatement ps = null;

		try {
			ps = conn.prepareStatement("INSERT INTO tbl(value) VALUES ( ?::json)");

			// 条件セット(1~)
			ps.setString(1, "{\"aaa\":\"bbb\",\"ccc\":\"ddd\"}");

			// SELECTを実行する
			ps.executeUpdate();

			System.out.println("insertTest_OK");
		} catch (Exception e) {
			System.out.println("insertTest_NG");
			throw e;
		} finally {
			if (ps != null) {
				ps.close();
				ps = null;
			}
		}
	}

	/**
	 * データ更新テスト
	 * 
	 * @param conn コネクション
	 * @throws SQLException SQL例外
	 */
	private static void updateTest(Connection conn) throws SQLException {
		PreparedStatement ps = null;
		try {
			ps = conn.prepareStatement("UPDATE tbl SET value = value || ?::JSONB WHERE value @> ?::JSONB");

			// 条件セット(1~)
			ps.setString(1, "{\"eee\":\"fff\",\"ccc\":\"DDD\"}");
			ps.setString(2, "{\"aaa\":\"bbb\"}");

			// SELECTを実行する
			ps.executeUpdate();

			System.out.println("updateTest_OK");
		} catch (Exception e) {
			System.out.println("updateTest_NG");
			throw e;
		} finally {
			if (ps != null) {
				ps.close();
				ps = null;
			}
		}
	}

	/**
	 * データ取得テスト
	 * 
	 * @param conn コネクション
	 * @throws SQLException SQL例外
	 */
	public static void selectTest(Connection conn) throws SQLException {

		ResultSet rs = null;
		PreparedStatement ps = null;

		try {

			// ステートメントの作成
			ps = conn.prepareStatement("select value from tbl where value @> ?::JSONB");

			// 条件セット(1~)
			ps.setString(1, "{\"aaa\":\"bbb\"}");

			// SELECTを実行する
			rs = ps.executeQuery();

			// 結果の表示
			while (rs.next()) {

				// データ取得(項目指定)
				System.out.println(rs.getString("value"));
			}

			System.out.println("selectTest_OK");
		} catch (Exception e) {
			System.out.println("selectTest_NG");
			throw e;
		} finally {
			if (rs != null) {
				rs.close();
				rs = null;
			}
			if (ps != null) {
				ps.close();
				ps = null;
			}
		}
	}
}


			
追加したデータを更新し、その結果を抽出しています。

追加後 {"aaa":"bbb","ccc":"ddd"}
更新後 {"aaa":"bbb","ccc":"DDD","eee":"fff",}

::JSONB はJSONB型にキャストしています。これがないとエラーになります。
抽出条件はJSONB特有のものを使ってます。詳細は前回を参照して下さい。

上記以外は通常のJDBCの処理と同様になります。

ページのトップへ戻る