java - 如何在java中为mysql的JSON数据类型使用准备好的语句?
Posted
技术标签:
【中文标题】java - 如何在java中为mysql的JSON数据类型使用准备好的语句?【英文标题】:How to use a prepared statement for JSON data types for mysql in java? 【发布时间】:2017-05-17 02:47:37 【问题描述】:我有一个 JSON 列,我想为其创建一个准备好的语句,但我不知道如何去做,因为该语句的参数位于文字字符串中。
例如:
PreparedStatement stmt = myConn.prepareStatement("SELECT JSON_SET(new_friends, '$.?', '[?]') from friend_list where id = ?");
for (int i = 0; i < new_friends.size(); i++)
String friend = new_friends.get(i);
// not sure what to put here
stmt.set....
stmt.set....
stmt.set(3, i);
大家有什么建议吗?
【问题讨论】:
我认为你应该将一个字符串作为参数传递给 JSON_SET 函数——毕竟它与任何其他函数没有什么不同:JSON_SET(new_friends, ?, ?)
。在这种情况下,对于第一个占位符,您将传递 '$.whatever'
的值,而对于第二个占位符 - '[1,2,3,4,5]'
。请注意,这些应该是字符串。至少试一试。
在查看了 mysql 文档之后,有一组可用的 JSON 相关函数,也许在您向数组添加新值的情况下,您可以使用 JSON_ARRAY_APPEND
。 dev.mysql.com/doc/refman/5.7/en/…
【参考方案1】:
?
占位符不像字符串插值那样使用。它们替换了 整个 参数。当函数参数是字符串时,整个参数必须是文字字符串或使用 SQL 字符串函数构建,将参数作为进一步的参数。
假设您的语法对于您想要实现的目标是正确的,请考虑以下几点:
JSON_SET(new_friends, '$.?', '[?]') -- not valid
JSON_SET(new_friends, ?, ?) -- valid
JSON_SET(new_friends, CONCAT('$.',?), CONCAT('[',?,']')) -- valid
参数 1 将设置为字符串 $.foo
用于上述第 2 行样式的查询,或 foo
设置为第 3 行样式的查询。
您的版本无效的原因正是您不/不能使用WHERE username = '?'
之类的东西,而是使用WHERE username = ?
(?
周围没有引号)的原因。
【讨论】:
谢谢!我现在要试试这个。这也适用于数值吗?【参考方案2】:如果您想将 java 列表对象添加到如下所述的 json 数组中:
"abc":["var1":"val1","var2":"val2","var3":"val3"]
如果列中已经有 json 值,则可以使用 JSON_SET 更新值。
String query;
query = "UPADTE tbl1 SET col1 = JSON_SET(col1, '$.abc', CAST(? AS JSON) ) WHERE cdtn = ?";
// if col1 is null then, JSON_SET would be: JSON_SET('', '$.abc', CAST(? AS JSON) )
try (Connection conn = DBUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(query))
ps.setString(1, jsonArray.toString());
ps.setString(2, cd);
ps.executeUpdate();
catch (SQLException e)
log.error("Error : ", e);
【讨论】:
以上是关于java - 如何在java中为mysql的JSON数据类型使用准备好的语句?的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何在hibernate java中为给定的xml使用注释
java - 如何在java printf中为数字符号保留符号?
java - 如何在java android中为Gridview的父类BaseAdapter实现viewBinding?