JDBCTemplate и MYSQL JSON
Я пишу службу отдыха, где мне нужно добавить несколько деталей в таблицу mysql.
Моя таблица mysql как столбец area_json
как тип json.
Я получил объект pojo из почтового вызова в службе отдыха, и я попытался вставить его с помощью jdbctemplate, например
jdbcTemplate.update("insert into site(area_id,area_json) values(?,?)", area.getareaID(), area.getareaJson());
Как только я делаю почтовый вызов с помощью почтового ящика, я получаю следующую ошибку
Invalid argument value: java.io.NotSerializableException;
nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException"
Пожалуйста помоги
Во-первых, обязательно используйте версию Connector/J не старше v5.1.37, где была добавлена поддержка типа данных JSON и, желательно, не старше v5.1.40, что устраняет некоторые связанные с JSON ошибки. Но если это проблема для вас, то она в лучшем случае вторична.
До этого даже важно, JdbcTemplate
должен понимать ваш аргумент JSONObject
. В конкретном методе, в котором используются документы, переменные аргументы, включая JSONObject
,
аргументы для привязки к запросу (оставляя его в
PreparedStatement
для угадывания соответствующего типа SQL); могут также содержать объектыSqlParameterValue
которые указывают не только значение аргумента, но также тип SQL и, необязательно, масштаб
Когда он говорит, что PreparedStatement
угадает, это может означать только версию с двумя аргументами PreparedStatement.setObject()
которая содержит документы:
Спецификация JDBC указывает стандартное сопоставление типов объектов Java с типами SQL. Данный аргумент будет преобразован в соответствующий тип SQL перед отправкой в базу данных.
Обратите внимание, что этот метод может использоваться для передачи специфических абстрактных типов данных datatabase- с использованием специфичного для драйвера типа Java. Если объект имеет класс, реализующий интерфейс SQLData, драйвер JDBC должен вызывать метод SQLData.writeSQL, чтобы записать его в поток данных SQL. Если, с другой стороны, объект имеет класс, реализующий Ref, Blob, Clob, NClob, Struct, java.net.URL, RowId, SQLXML или Array, драйвер должен передать его в базу данных как значение соответствующего SQL.
(Акцент добавлен.)
JDBC не имеет встроенной поддержки типа данных JSON. Документы позволяют Connector/J предоставлять конкретный тип драйвера, соответствующий типу данных JSON SQL, но только потому, что поддержка MySQL и Connector/J JSON не означает, что вы можете вытащить случайный объект, представляющий JSON, с полки и представить его им, а также тому, что они вообще предоставляют или поддерживают JSON-специфический Java-тип данных. Поскольку MySQL, похоже, не публикует и не ссылается на какую-либо документацию API расширения JDBC в своем руководстве разработчика Connector/J, я склонен сомневаться в том, что он распознает любой такой тип.
Похоже, что вам следует полагаться на ту же технику, что и при программировании непосредственно на диалоговом языке SQL SQL:
В MySQL значения JSON записываются как строки. MySQL анализирует любую строку, используемую в контексте, который требует значения JSON, и выдает ошибку, если он недействителен как JSON. Эти контексты включают вставку значения в столбец с типом данных JSON и передачу аргумента функции, ожидающей значения JSON [...].
(Справочное руководство по MySQL 5.7, раздел 11.6)
То есть, конвертировать JSONObject
в JSON-формате String
, и представить его в шаблон таким образом. При извлечении ожидайте сделать обратное.