[JAVA] Comment stocker des objets dans PostgreSQL au format JSON avec MyBatis (Mapper XML)

Chose que tu veux faire

Je souhaite stocker l'objet en tant que type JSONB dans PostgreSQL lorsque Spring + Mybatis (l'instruction SQL est définie par Mapper XML)

manière

Cette fois, j'en couvrirai deux.

Comment trouver

Une fois du côté Java, créez-en une chaîne et transtypez-la en JSONB dans l'instruction SQL stockée. Utilisez com.fasterxml.jackson.databind.ObjectMapper pour Object → String.

Appelant SQL


Object data = hoge(); //Données que vous souhaitez stocker
ObjectMapper mapper = new ObjectMapper();
String objectJSON = mapper.writeValueAsString(data)
sqlClient.insert(objectJSON)

MapperXML


<insert id="insert">
    insert into hogetable (data) values (#{objectJSON}::jsonb);
</insert>

Si la chaîne est au format JSON, elle sera stockée.

Un peu inquiétant

En parlant de travailler avec cela, cela fonctionne, mais si possible, j'aimerais le garder en tant qu'objet en Java. Il est difficile pour l'appelant de se donner la peine de le formater pour qu'il soit facile à utiliser pour l'appelant.

Par conséquent, du côté Java, conservez l'objet tel quel et convertissez-le au format JSON en ** Mapper XML. ** Cela résoudra les problèmes mentionnés précédemment.

Comment effectuer le traitement dans ObjectMapper du côté MyBatis

Commencez par concevoir l'interface Mapper comme suit. Le fait est que pour exécuter com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString dans Mapper XML, ʻObjectMapper` est également entrepris.

Interface du mappeur


insert(@Param("objectMapper") ObjectMapper objectMapper, @Param("object") Object object);

L'appelant passe simplement ʻObjectMapper` et l'objet que vous voulez stocker.

Appelant SQL


Object data = hoge(); //Données que vous souhaitez stocker
ObjectMapper mapper = new ObjectMapper();
sqlClient.insert(mapper, data)

Mapper XML utilise également ** des expressions de liaison. ** **

MapperXML


<insert id="insert">
    <bind name="objectJSON" value="objectMapper.writeValueAsString(object)" />
    insert into hogetable (data) values ('${objectJSON}'::jsonb)
</insert>

Dans l'expression de liaison, la valeur écrite dans value est affectée à la variable spécifiée par nom. À ce stade, non seulement la valeur elle-même mais également l'expression ** peuvent être écrites dans la valeur. ** **

Les instructions sql suivantes peuvent être référencées avec $ {nom de variable}. Cependant, $ {nom de la variable} est juste un remplacement, vous devez donc le mettre entre guillemets simples pour en faire une chaîne (type de texte dans PostgreSQL). De plus, vous ne devriez pas vraiment utiliser $ {}. C'est juste un remplacement qui le rend vulnérable à l'injection ** SQL. ** **

En fait, je devrais utiliser le # {} qui résout ce problème, mais je ne pourrais pas bien y faire référence ...

Un peu inquiétant

Après tout, je l'ai atteint car le but de cet article est de déplacer le mappage Objet → Chaîne du côté Java vers le côté Mybatis.

Cependant, puisque l'appelant prépare le mappeur, je ne pense pas que l'on puisse dire que le traitement a été complètement transféré. Si le contenu de traitement du côté Mybatis est à nouveau modifié, le côté Java doit également être modifié. Lorsque je tente d'implémenter une architecture résistante au changement **, je ne veux pas compter sur des connexions externes. ** **

À cet égard, ce serait bien si Mybatis pouvait préparer un mappeur. Si l'appelant peut préparer le mappeur, l'appelant n'a qu'à transmettre les données lui-même. Si je trouve un moyen de le faire, je le mettrai à jour à nouveau.

Recommended Posts

Comment stocker des objets dans PostgreSQL au format JSON avec MyBatis (Mapper XML)
Comment utiliser le type d'énumération Java (Enum) dans Mapper XML de MyBatis
Comment stocker des objets dans PostgreSQL au format JSON avec MyBatis (Mapper XML)
Formater XML en Java
Comment passer un objet à Mapper dans MyBatis sans passer par un argument
Comment passer un objet à Mapper dans MyBatis sans passer par un argument
Comment utiliser le type d'énumération Java (Enum) dans Mapper XML de MyBatis
Mappage à une classe avec un objet de valeur dans How to My Batis
Convertir un objet ruby au format JSON
Comment stocker des objets dans PostgreSQL au format JSON avec MyBatis (Mapper XML)
Bibliothèque de mappage d'objets JAVA
19 Correspond à la création d'objet
Comment passer un objet à Mapper dans MyBatis sans passer par un argument
Mappage à une classe avec un objet de valeur dans How to My Batis
Qu'est-ce qu'un objet immuable? [Explication comment faire]
Comment demander un fichier CSV au format JSON avec jMeter
Comment utiliser la même classe Mapper dans plusieurs sources de données avec Spring Boot + MyBatis
Comment utiliser l'annotation MyBatis Mapper
[Solution au problème] SAXReader: Comment lire un fichier xml avec un fichier DTD externe spécifié dans un environnement hors ligne
Comment recadrer une image avec libGDX
[Java] Affiche le résultat de ffprobe -show_streams dans JSON et mappe-le à un objet dans Jackson
Développement Android, comment vérifier null dans la valeur de l'objet JSON
Comment assembler JSON directement dans Jackson
Une erreur s'est produite lors de l'exécution d'une fonction avec CURSOR défini dans le paramètre OUT de MyBatis dans PostgreSQL.
Comment stocker simultanément des données dans un modèle associé à une forme imbriquée (Rails 6.0.0)
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment tout insérer en même temps avec MyBatis
Comment résoudre les problèmes d'expression en Java
[Rails] Comment créer un environnement avec Docker
Comment créer un fichier exécutable dans Maven
[Rails] Comment utiliser PostgreSQL dans l'environnement Vagrant
Comment utiliser git avec la puissance de jgit dans un environnement sans commandes git
Je souhaite renvoyer un objet au format CSV avec en-tête et filtre multilignes en Java
Comment rendre une image partiellement transparente avec le traitement
Comment implémenter UICollectionView avec du code uniquement dans Swift
Comment trier par ordre croissant / décroissant avec SQLite
Comment appeler des fonctions en bloc avec la réflexion Java
Comment basculer Tomcat context.xml avec Eclipse WTP
Comment pousser une application développée avec Rails vers Github
Comment supprimer un objet new_record construit avec Rails
Comment utiliser la bibliothèque Z3 dans Scala avec Eclipse
Comprendre comment utiliser le décodeur JSON de Swift en 3 minutes
Organisé comment interagir avec le JDK par étapes
Comment sortir le standard d'un tableau avec for Each
[Comment insérer une vidéo dans un hameau avec Rails]
Comment supprimer des images non balisées en masse avec Docker
Comment utiliser la bibliothèque JDD dans Scala avec Eclipse
Comment interroger Array dans jsonb avec Rails + postgres
[Rails] Comment afficher les images dans la vue
Comment utiliser la méthode getter / setter (en orientation objet)
Comment utiliser les données JSON dans la communication WebSocket (Java, JavaScript)
Comment changer une chaîne dans un tableau en un nombre dans Ruby
Comment obtenir des valeurs en temps réel avec TextWatcher (Android)
Comment récupérer la valeur de hachage dans un tableau dans Ruby
Comment stocker des chaînes de ArrayList à String en Java (personnel)
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Comment spécifier la base de données lors de la création d'une application avec des rails
Comment utiliser ArgumentMatchers tels que Mockito's any () dans Kotlin
Comment créer une application à l'aide de Tensorflow avec Android Studio
La sérialisation de org.joda.time.DateTime en JSON au format ISO8601 s'accompagne d'une milliseconde
Qu'est-ce qu'un objet immuable? [Explication comment faire]
Comment configurer un proxy avec authentification dans Feign
Comment s'inscrire en tant que client dans Square à l'aide de Tomcat
[Java] Comment rechercher des valeurs dans un tableau (ou une liste) avec la méthode contains