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 中为自动增量表创建查询?

如何在pycharm中为java打开语法高亮?

java - 如何在hibernate java中为给定的xml使用注释

java - 如何在java printf中为数字符号保留符号?

如何在 Java 中为 Swing 组件设置字体粗细

java - 如何在java android中为Gridview的父类BaseAdapter实现viewBinding?