Verwenden Sie den PostgreSQL-Datentyp (jsonb) aus Java

Ich habe untersucht, wie man die für PostgreSQL typische Datenseite von Python verwendet, also werde ich sie aufzeichnen.

Hier geht es um den Typ jsonb.

Dieser Inhalt ist ein Auszug aus dem Inhalt der 51. Nagaoka IT Developer Study Group. Die Folie ist hier.

Die Python-Version ist hier.

Verwenden Sie PostgreSQL aus Java

利用方法

Bei Verwendung von PostgreSQL aus einer Anwendung Verwendung über die JDBC-API. Die JDBC-API ist eine Spezifikation mit nur einer Schnittstelle, und es gibt einen JDBC-Treiber für PostgreSQL als Implementierung. Dies ist der offizielle PostgreSQL JDBC-Treiber.

Es gibt verschiedene DB-Zugriffsbibliotheken über JDBC. Dieses Mal wird jedoch ein Beispiel für die Verwendung von JPA als Java-Standardpersistenzspezifikation betrachtet. JPA ist auch eine Spezifikation und eine Schnittstelle wird vorbereitet. Eine der Implementierungen ist EclipseLink.

Quellcode

https://github.com/civic/postgresql-java-json

Verwenden Sie jsonb

id info
1 {"a": 100, "b": "Hello"}
2 {"a": 200, "b": "World"}
CREATE TABLE json_test(
  id integer,
  info jsonb
)

Verwenden von jsonb aus der Low-Level-API (JDBC)

SELECT

resultSet.getString("info");
// {"a": 100, "b": "Hello"}

Sie können die JSON-Zeichenfolge abrufen, indem Sie die Spalte json und getString abrufen.

INSERT (1)

import org.postgresql.util.PGobject;

PGobject pgobj =new PGobject();
pgobj.setValue(json_string); //json string
pgobj.setType("jsonb");

preparedStatement.setObject(1, pgobj);

In der JDBC-API gibt es keinen JSON-Typ. Es wird normalerweise über die von JDBC bereitgestellte Schnittstelle verwendet, es bleibt jedoch keine andere Wahl, als die Funktionen des von PostgreSQL bereitgestellten Treibers zu verwenden. Sollte in begrenzten Bereichen wie gemeinsamen Bibliotheken verwendet werden.

INSERT (2)

PreparedStatement ps =conn.prepareStatement(
 "INSERT INTO json_test(info) VALUES(jsonb(?))"
);

ps.setString(1, json_string);  //json string

Ein Muster, das Parameter als JSON-Zeichenfolge festlegt und sie in einer SQL-Anweisung in jsonb umwandelt. Da es sich um setString als Zeichenfolge handelt, ist dies nur mit der Standard-API möglich.

Verwendung von jsonb aus der High-Level-API (JPA)

SELECT / INSERT

@Entity
@Table(name = "json_test")
public class JsonTest implements Serializable {
    // ...Unterlassung...

    @Column(name = "info")
    @Convert(converter = JsonbConverter.class)
    private String info;
...

JPA, eine OR-Mapper-ähnliche Persistenzfunktion. Ein Mechanismus namens Konverter ist in den JPA-Spezifikationen vorbereitet. Wenn Sie einen Konverter erstellen und eine gegenseitige Konvertierung vom Java-Typ <=> SQL-Typ definieren, können Sie diese für die Spaltendefinition mit Anmerkungen verwenden.

Implementierung von Jsonb Converter

/**
@Converter
public class JsonbConverter implements AttributeConverter<String, PGobject>{

    /**
     * String-Umstellung auf Pgobject
     * @param x
     * @return 
     */
    @Override
    public PGobject convertToDatabaseColumn(String x) {
        PGobject pgobject =new PGobject();
        pgobject.setType("jsonb");
        try {
            pgobject.setValue(x);
        } catch (SQLException ex) {
            Logger.getLogger(JsonbConverter.class.getName()).log(Level.SEVERE, null, ex);
            throw new RuntimeException(ex);
        }
        return pgobject;
    }

    @Override
    /**
     * Pgobject-In String konvertieren
     * @param y
     * @return 
     */
    public String convertToEntityAttribute(PGobject y) {
        return y.getValue();
    }
    
}

Recommended Posts

Verwenden Sie den PostgreSQL-Datentyp (jsonb) aus Java
[Java] Datentyp ①-Basistyp
Java-Lernnotiz (Datentyp)
Stellen Sie eine Verbindung von Java zu PostgreSQL her
Verwenden Sie den PostgreSQL-Inet-Typ mit DbUnit
[Java] Datentyp / Matrixprodukt (AOJ ⑧ Matrixprodukt)
Java (Klassentyp für Feld verwenden)
Verwenden Sie Chrome Headless von Selenium / Java
Verwendung des Java-Aufzählungstyps
Konvertierung des Java-Datumsdatentyps (Datum, Kalender, Zeichenfolge)
Datenverarbeitung mit der Stream-API von Java 8
[Persönliches Memo] Der Java-Datentyp ist ärgerlich
[Java] Spickzettel für Datentyp / Zeichenkettenklasse
Kinesis-Datenströme ohne Java-Erfahrung (1)
Kinesis-Datenströme ohne Java-Erfahrung (3.1)
Kinesis-Datenströme ohne Java-Erfahrung (3.2)
Typkonvertierung vom Java Big Decimal-Typ zum String-Typ
Java-Typkonvertierung
Verwenden Sie native Bibliotheken von Scala über Java CPP + Java
[Java] Aufzählungstyp
Java Optionaler Typ
[Verarbeitung × Java] Datentyp und objektorientierte Programmierung
Verwenden Sie Matplotlib aus Java oder Scala mit Matplotlib4j
Java-Doppeltyp
Organisiertes Memo im Kopf (Java - Datentyp)
[Java] Verwenden Sie Collectors.collectingAndThen
Informationen zum Java-Grunddatentyp- und Referenztypspeicher
Informationen zu CLDR-Gebietsschemadaten, die standardmäßig in Java 9 aktiviert sind
JAWJAW ist praktisch, wenn Sie WordNet aus Java verwenden
Rufen Sie Java von JRuby aus auf
Änderungen von Java 8 zu Java 11
Summe von Java_1 bis 100
Eval Java-Quelle von Java
Führen Sie PostgreSQL unter Java aus
Greifen Sie über Java auf API.AI zu
Verwenden Sie OpenCV mit Java
[Java, Kotlin] Typabweichung
Feld für den Java-Klassentyp
Typbestimmung in Java
Java # 1 studieren (typischer Typ)
Von Java zu Ruby !!
Verwenden Sie TensorFlow von JRuby
[Java] Hauptdatentypen
Verwenden Sie PostgreSQL in Scala
Verwenden Sie PreparedStatement in Java
Java-Grunddatentypen
[Java] Konvertierung des Datumstyps
Java, das Daten von Android zu Jetson Nanos ROS überspringt
Suchen Sie die Adressklasse und den Adresstyp aus der IP-Adresse mit Java
Holen Sie sich Wettervorhersagen von Watson Weather Company Data mit einfachem Java
Verwendung von JSON-Daten in der WebSocket-Kommunikation (Java, JavaScript)
CData Software Hands-on (Abrufen von Kintone-Daten aus der Java-Konsolenanwendung)
[IOS 14] Wie erhalte ich Bilddaten vom Datentyp direkt von PHPickerViewController?
CData Software Hands-on (Twitter-Daten von der Java-Konsolenanwendung abrufen)