Ich möchte Object als JSONB-Typ in PostgreSQL speichern, wenn Spring + Mybatis (SQL-Anweisung wird durch Mapper XML definiert)
Dieses Mal werde ich zwei behandeln.
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.
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.
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 ...
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