Utiliser le type de données PostgreSQL (jsonb) à partir de Java

J'ai étudié comment utiliser le côté données propre à PostgreSQL à partir de Python, je vais donc l'enregistrer.

Il s'agit du type jsonb.

Ce contenu est un extrait du contenu présenté au 51e Nagaoka IT Developer Study Group. La diapositive est ici.

La version Python est ici.

Utiliser PostgreSQL depuis Java

利用方法

Lors de l'utilisation de PostgreSQL depuis une application Utiliser via l'API JDBC. L'API JDBC est une spécification avec uniquement une interface, et il existe un pilote JDBC pour PostgreSQL comme implémentation. Il s'agit du pilote JDBC officiel de PostgreSQL.

Il existe différentes bibliothèques d'accès à la base de données via JDBC, mais cette fois, nous allons considérer un exemple d'utilisation de JPA comme spécification de persistance standard Java. JPA est également une spécification et une interface est préparée. L'une des implémentations est EclipseLink.

Code source

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

Utilisez jsonb

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

Utilisation de jsonb à partir de l'API de bas niveau (JDBC)

SELECT

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

Vous pouvez obtenir la chaîne de caractères JSON en récupérant la colonne json et en obtenantString.

INSERT (1)

import org.postgresql.util.PGobject;

PGobject pgobj =new PGobject();
pgobj.setValue(json_string); //chaîne json
pgobj.setType("jsonb");

preparedStatement.setObject(1, pgobj);

Il n'y a pas de type JSON dans l'API JDBC. Il est généralement utilisé via l'interface fournie par JDBC, mais il n'y a pas d'autre choix que d'utiliser les fonctions du pilote fourni par PostgreSQL. Doit être utilisé dans des domaines limités tels que les bibliothèques communes.

INSERT (2)

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

ps.setString(1, json_string);  //chaîne json

Un modèle qui définit les paramètres sous forme de chaîne JSON et les convertit en jsonb dans une instruction SQL. Comme il s'agit de setString sous forme de chaîne de caractères, cela n'est possible qu'avec l'API standard.

Utilisation de jsonb à partir de l'API de haut niveau (JPA)

SELECT / INSERT

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

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

JPA, une fonction de persistance semblable à un mappeur OR. Un mécanisme appelé Converter est préparé dans les spécifications JPA. Si vous créez un convertisseur et définissez une conversion mutuelle de type Java <=> SQL, vous pouvez l'utiliser pour la définition de colonne avec des annotations.

Implémentation de Jsonb Converter

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

    /**
     * String-Conversion en 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-Convertir en chaîne
     * @param y
     * @return 
     */
    public String convertToEntityAttribute(PGobject y) {
        return y.getValue();
    }
    
}

Recommended Posts

Utiliser le type de données PostgreSQL (jsonb) à partir de Java
[Java] Type de données ①-Type de base
Mémo d'apprentissage Java (type de données)
Connectez-vous de Java à PostgreSQL
Utiliser le type inet PostgreSQL avec DbUnit
[Java] Type de données / produit matriciel (produit matriciel AOJ ⑧)
java (utilisez le type de classe pour le champ)
Utiliser Chrome Headless de Selenium / Java
Comment utiliser le type enum Java
Conversion de type de données de date Java (date, calendrier, chaîne)
Traitement des données à l'aide de l'API de flux de Java 8
[Note personnelle] Le type de données Java est ennuyeux
[Java] Aide-mémoire de classe de type de données / chaîne de caractères
Flux de données Kinesis à partir de zéro expérience Java (1)
Flux de données Kinesis à partir de zéro expérience Java (3.1)
Flux de données Kinesis à partir de zéro expérience Java (3.2)
Conversion de type du type java Big Decimal au type String
Conversion de type Java
Utiliser les bibliothèques natives de Scala via Java CPP + Java
[Java] Type d'énumération
Java Type facultatif
[Traitement × Java] Type de données et programmation orientée objet
Utilisez Matplotlib depuis Java ou Scala avec Matplotlib4j
Java double type
Mémo organisé dans la tête (Java - type de données)
[Java] Utilisez Collectors.collectingAndThen
A propos du type de données de base Java et de la mémoire du type de référence
À propos des données locales CLDR activées par défaut à partir de Java 9
JAWJAW est pratique si vous utilisez WordNet à partir de Java
Appeler Java depuis JRuby
Changements de Java 8 à Java 11
Somme de Java_1 à 100
Évaluer la source Java à partir de Java
Exécutez PostgreSQL sur Java
Accédez à API.AI depuis Java
Utiliser OpenCV avec Java
[Java, Kotlin] Variance de type
Champ de type de classe Java
Détermination de type en Java
Étudier Java # 1 (type typique)
De Java à Ruby !!
Utilisez TensorFlow de JRuby
[Java] Principaux types de données
Utiliser PostgreSQL dans Scala
Utiliser PreparedStatement en Java
Types de données de base Java
[Java] Conversion de type de date
Java qui ignore les données d'Android vers le ROS de Jetson Nano
Trouvez la classe d'adresse et le type d'adresse à partir de l'adresse IP avec Java
Obtenez les prévisions météorologiques de Watson Weather Company Data avec Java simple
Comment utiliser les données JSON dans la communication WebSocket (Java, JavaScript)
Logiciel pratique CData (obtenir des données kintone à partir de l'application console Java)
[IOS 14] Comment obtenir des données d'image de type Data directement à partir de PHPickerViewController?
Logiciel pratique CData (obtenir des données Twitter à partir de l'application console Java)