[JAVA] Speichern von Objekten in PostgreSQL als JSON mit MyBatis (Mapper XML)

Was du machen willst

Ich möchte Object als JSONB-Typ in PostgreSQL speichern, wenn Spring + Mybatis (SQL-Anweisung wird durch Mapper XML definiert)

Weise

Dieses Mal werde ich zwei behandeln.

Wie kommt man darauf?

Machen Sie es auf der Java-Seite zu einem String und wandeln Sie es in der zu speichernden SQL-Anweisung in JSONB um. Verwenden Sie "com.fasterxml.jackson.databind.ObjectMapper" für Objekt → Zeichenfolge.

SQL-Aufrufer


Object data = hoge(); //Daten, die Sie speichern möchten
ObjectMapper mapper = new ObjectMapper();
String objectJSON = mapper.writeValueAsString(data)
sqlClient.insert(objectJSON)

MapperXML


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

Wenn der String im JSON-Format vorliegt, wird er gespeichert.

Ein bisschen besorgniserregend

Apropos damit zu arbeiten, es funktioniert, aber wenn möglich, möchte ich es als Objekt in Java behalten. Es ist für den Anrufer umständlich, sich die Mühe zu machen, es so zu formatieren, dass es für den Anrufer einfach zu bedienen ist.

Behalten Sie daher auf der Java-Seite das Objekt bei und konvertieren Sie es in das JSON-Format in ** Mapper XML. ** Dies löst die zuvor genannten Probleme.

So führen Sie die Verarbeitung in ObjectMapper auf der MyBatis-Seite durch

Entwerfen Sie zunächst die Mapper-Schnittstelle wie folgt. Der Punkt ist, dass zum Ausführen von "com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString" in Mapper XML auch "ObjectMapper" ausgeführt wird.

Mapper-Schnittstelle


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

Der Aufrufer übergibt einfach den ObjectMapper und das Objekt, das Sie speichern möchten.

SQL-Aufrufer


Object data = hoge(); //Daten, die Sie speichern möchten
ObjectMapper mapper = new ObjectMapper();
sqlClient.insert(mapper, data)

Mapper XML verwendet auch ** Bindungsausdrücke. ** ** **

MapperXML


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

Im Bindungsausdruck wird der in value geschriebene Wert der durch name angegebenen Variablen zugewiesen. Zu diesem Zeitpunkt kann nicht nur der Wert selbst, sondern auch der Ausdruck ** in den Wert geschrieben werden. ** ** **

Nachfolgende SQL-Anweisungen können mit "$ {Variablenname}" referenziert werden. $ {Variablenname} ist jedoch nur ein Ersatz, daher müssen Sie es in einfache Anführungszeichen setzen, um daraus eine Zeichenfolge zu machen (Texttyp in PostgreSQL). Außerdem sollten Sie $ {} nicht wirklich verwenden. Es ist nur ein Ersatz, der es anfällig für ** SQL-Injection macht. ** ** **

Eigentlich sollte ich das "# {}" verwenden, das dieses Problem löst, aber ich konnte mich nicht gut darauf beziehen ...

Ein bisschen besorgniserregend

Immerhin habe ich es erreicht, weil der Zweck dieses Artikels darin besteht, die Objekt → String-Zuordnung von der Java-Seite auf die Mybatis-Seite zu verschieben.

Da der Anrufer den Mapper vorbereitet, kann ich nicht sagen, dass die Verarbeitung vollständig übertragen wurde. Wenn der Verarbeitungsinhalt auf der Mybatis-Seite erneut geändert wird, muss auch die Java-Seite geändert werden. Beim Versuch, eine veränderungsresistente Architektur zu implementieren, ** möchte ich mich nicht auf externe Verbindungen verlassen. ** ** **

Insofern wäre es schön, wenn Mybatis einen Mapper vorbereiten könnte. Wenn der Anrufer den Mapper vorbereiten kann, muss der Anrufer nur die Daten selbst übergeben. Wenn ich einen Weg dazu finde, werde ich ihn erneut aktualisieren.

Recommended Posts

Speichern von Objekten in PostgreSQL als JSON mit MyBatis (Mapper XML)
Verwendung des Java-Aufzählungstyps (Enum) in Mapper XML von MyBatis
Speichern von Objekten in PostgreSQL als JSON mit MyBatis (Mapper XML)
Formatieren Sie XML in Java
So übergeben Sie ein Objekt in MyBatis an Mapper, ohne ein Argument durchzugehen
So übergeben Sie ein Objekt in MyBatis an Mapper, ohne ein Argument durchzugehen
Verwendung des Java-Aufzählungstyps (Enum) in Mapper XML von MyBatis
Zuordnung zu einer Klasse mit einem Wertobjekt in How to My Batis
Konvertieren Sie das Ruby-Objekt in das JSON-Format
Speichern von Objekten in PostgreSQL als JSON mit MyBatis (Mapper XML)
JAVA-Objektzuordnungsbibliothek
19 Entspricht der Objekterstellung
So übergeben Sie ein Objekt in MyBatis an Mapper, ohne ein Argument durchzugehen
Zuordnung zu einer Klasse mit einem Wertobjekt in How to My Batis
Was ist ein unveränderliches Objekt? [Erklärung, wie man macht]
So fordern Sie mit jMeter eine CSV-Datei als JSON an
Verwendung derselben Mapper-Klasse in mehreren Datenquellen mit Spring Boot + MyBatis
Verwendung der MyBatis Mapper-Annotation
[Problemlösung] SAXReader: Lesen einer XML-Datei mit einer externen DTD-Datei, die in einer Offline-Umgebung angegeben ist
So beschneiden Sie ein Bild in libGDX
[Java] Geben Sie das Ergebnis von ffprobe -show_streams in JSON aus und ordnen Sie es einem Objekt in Jackson zu
Android-Entwicklung, wie man den Wert des JSON-Objekts auf null überprüft
So montieren Sie JSON direkt in Jackson
Beim Ausführen einer Funktion in PostgreSQL mit dem Parameter OUT von MyBatis auf CURSOR ist ein Fehler aufgetreten.
So speichern Sie gleichzeitig Daten in einem Modell, das einem verschachtelten Formular zugeordnet ist (Rails 6.0.0)
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
So fügen Sie mit MyBatis alles auf einmal ein
So lösen Sie Ausdrucksprobleme in Java
[Rails] So erstellen Sie eine Umgebung mit Docker
So erstellen Sie ein ausführbares JAR in Maven
[Rails] Verwendung von PostgreSQL in einer Vagrant-Umgebung
Verwendung von git mit der Leistung von jgit in einer Umgebung ohne git-Befehle
Ich möchte ein Objekt im CSV-Format mit mehrzeiligem Header und Filter in Java zurückgeben
So machen Sie ein Bild mit Processing teilweise transparent
So implementieren Sie UICollectionView mit Code nur in Swift
So sortieren Sie mit SQLite in aufsteigender / absteigender Reihenfolge
Aufrufen von Funktionen in großen Mengen mit Java Reflection
So wechseln Sie Tomcat context.xml mit Eclipse WTP
So pushen Sie mit Rails entwickelte Apps an Github
So löschen Sie ein mit Rails erstelltes new_record-Objekt
Verwendung der Z3-Bibliothek in Scala mit Eclipse
Verstehen Sie, wie Sie den JSON-Decoder von Swift in 3 Minuten verwenden
Organisierte schrittweise Interaktion mit dem JDK
So geben Sie einen Standard aus einem Array mit for Each aus
[So fügen Sie ein Video mit Rails in haml ein]
So löschen Sie mit Docker Bilder ohne Tags in großen Mengen
Verwendung der JDD-Bibliothek in Scala mit Eclipse
Abfragen von Arrays in jsonb mit Rails + postgres
[Schienen] So zeigen Sie Bilder in der Ansicht an
Verwendung der Getter / Setter-Methode (in Objektorientierung)
Verwendung von JSON-Daten in der WebSocket-Kommunikation (Java, JavaScript)
So ändern Sie eine Zeichenfolge in einem Array in eine Zahl in Ruby
So erhalten Sie Werte in Echtzeit mit TextWatcher (Android)
So rufen Sie den Hashwert in einem Array in Ruby ab
Speichern von Zeichenfolgen von ArrayList zu Zeichenfolge in Java (Personal)
Was ist in "Java 8 bis Java 11" passiert und wie wird eine Umgebung erstellt?
So geben Sie db beim Erstellen einer App mit Rails an
Verwendung von ArgumentMatchern wie Mockitos any () in Kotlin
So erstellen Sie eine App mit Tensorflow mit Android Studio
Die Serialisierung von org.joda.time.DateTime zu JSON im ISO8601-Format erfolgt in Millisekunden
Was ist ein unveränderliches Objekt? [Erklärung, wie man macht]
So richten Sie einen Proxy mit Authentifizierung in Feign ein
So registrieren Sie sich mit Tomcat als Kunde in Square
[Java] So suchen Sie mit der Methode includes nach Werten in einem Array (oder einer Liste)