In erster Linie, stellen Sie sicher, eine Version von Connector/J nicht älter als v5.1.37 zu verwenden, wo Unterstützung für den JSON-Datentyp hinzugefügt wurde, und vorzugsweise n o älter als v5.1.40, wodurch einige JSON-Bugs behoben wurden. Aber wenn das ein Problem für dich ist, dann ist es bestenfalls zweitrangig.
Bevor das schon zählt, muss JdbcTemplate
Ihr JSONObject
Argument verstehen. The particular method you are using Dokumente, dass die variablen Argumente, einschließlich Ihrer JSONObject
sind
Argumente, um die Abfrage zu binden (so dass es zu der PreparedStatement
zu die entsprechenden SQL-Typ erraten); kann auch SqlParameterValue
Objekte enthalten, die nicht nur das Argument Wert angeben, aber die SQL Art auch und
die Waage optional Wenn es die PreparedStatement
sagt erraten, kann es nur the two-arg version of PreparedStatement.setObject()
bedeuten, die dokumentiert:
Die JDBC-Spezifikation spezifiziert eine Standardzuordnung von Java-Objekt Typen zu SQL-Typen. Das angegebene Argument wird in den entsprechenden SQL-Typ konvertiert, bevor es an die Datenbank gesendet wird.
Beachten Sie, dass diese Methode verwendet werden kann, um datenbankspezifische abstrakte Datentypen zu übergeben, indem ein treiberspezifischer Java-Typ verwendet wird. Wenn das Objekt einer Klasse angehört, die die Schnittstelle SQLData implementiert, sollte der JDBC -Treiber die Methode SQLData.writeSQL aufrufen, um sie in den SQL-Datenstrom zu schreiben. Wenn das Objekt andererseits aus einer Klasse besteht, die Ref, Blob, Clob, NClob, Struct, java.net.URL, RowId, SQLXML oder Array implementiert, sollte der Treiber es als Wert an die Datenbank übergeben des entsprechenden SQL-Typs.
(Hervorhebung hinzugefügt.)
JDBC haben nicht für einen JSON-Datentyp integrierte Unterstützung. Die Dokumente erlauben Connector/J, einen treiberspezifischen Typ entsprechend dem JSON-SQL-Datentyp bereitzustellen, aber nur weil MySQL und Connector/J JSON unterstützen, bedeutet das nicht, dass Sie ein zufälliges JSON-repräsentierendes Objekt aus dem Regal ziehen und präsentieren können zu ihnen, noch in der Tat, dass sie überhaupt einen JSON-spezifischen Java-Datentyp bereitstellen oder unterbringen.Da MySQL anscheinend keine Dokumentation von JDBC-Erweiterungs-APIs in seiner Connector/J developer guide veröffentlicht oder referenziert, bin ich geneigt zu bezweifeln, dass es einen solchen Typ erkennt.
Es scheint also, dass Sie sich auf der gleichen Technik verlassen sollten, was Sie tun würden, wenn sie direkt in die MySQL-SQL-Dialekt Programmierung:
In MySQL, JSON-Werte werden als Zeichenketten geschrieben. MySQL analysiert jede Zeichenfolge , die in einem Kontext verwendet wird, der einen JSON-Wert erfordert, und erzeugt einen Fehler, wenn nicht als JSON gültig ist. Zu diesen Kontexten gehört das Einfügen eines Werts in eine Spalte mit dem JSON-Datentyp und die Übergabe eines Arguments an eine -Funktion, die einen JSON-Wert erwartet [...].
(MySQL 5.7 Reference Manual, section 11.6)
Das heißt, wandeln Sie Ihre JSONObject
zu einem JSON-Format String
und präsentieren es auf die Vorlage auf diese Weise. Erwarten Sie beim Zurückholen, dass Sie das Gegenteil tun müssen.
Was lässt Sie daran denken, dass die Übergabe eines JSONObject als Parameter mithilfe von JdbcTemplate unterstützt wird und das zugrunde liegende JSON-Dokument in einer MySQL JSON-Spalte speichert? Ist das irgendwo dokumentiert? Wenn nicht, würde ich mich nur auf die MySQL-Dokumentation verlassen: https://dev.mysql.com/doc/refman/5.7/en/json.html. Und übergeben Sie ein JSON-Dokument als String (nicht getestet, aber es scheint viel wahrscheinlicher zu sein, entsprechend der Dokumentation). –