JDBCTemplate和MYSQL JSON
我正在编写一个休息服务,我需要在mysql表中添加一些细节。
my mysql table as a area_json
,类型为json。
我从休息服务中的post call获得了一个pojo对象,我试图使用jdbctemplate插入它
jdbcTemplate.update("insert into site(area_id,area_json) values(?,?)", area.getareaID(), area.getareaJson());
一旦我使用post man进行发布呼叫,我就会收到以下错误
Invalid argument value: java.io.NotSerializableException;
nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException"
请帮忙
答案 0 :(得分:3)
首先,请确保使用不早于v5.1.37的Connector / J版本,其中添加了对JSON数据类型的支持,并且最好不要比v5.1.40更旧,这修复了一些与JSON相关的错误。但如果这对你来说是一个问题,那么它最好是次要的。
在此之前,JdbcTemplate
需要理解你的JSONObject
论点。 The particular method you are using记录了变量参数,包括您的JSONObject
绑定到查询的参数(将其留给
PreparedStatement
猜对应的SQL类型);也可能包含SqlParameterValue
不仅指示参数值而且指示SQL的对象 类型和可选的比例
当它说出PreparedStatement
会猜到时,它只能表示the two-arg version of PreparedStatement.setObject()
哪些文件:
JDBC规范指定了Java Object的标准映射 类型到SQL类型。给定的参数将转换为 在发送到数据库之前对应的SQL类型。
请注意,此方法可用于传递特定于数据库的内容 抽象数据类型,使用特定于驱动程序的Java类型。如果 object是一个实现接口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似乎不在其Connector/J developer guide中发布或引用任何JDBC扩展API文档,我倾向于怀疑它是否识别出任何类型的这些文档。
那么,您似乎应该依赖于在MySQL的SQL方言中直接编程时所采用的相同技术:
在MySQL中,JSON值被写为字符串。 MySQL解析任何字符串 在需要JSON值的上下文中使用,如果出现错误,则会产生错误 它无效为JSON。这些上下文包括插入值 具有JSON数据类型并将参数传递给a的列 需要JSON值的函数[...]。
(MySQL 5.7 Reference Manual, section 11.6)
也就是说,将您的JSONObject
转换为JSON格式String
,并以此方式将其呈现给您的模板。在检索时,预计必须反过来。