2017-01-03 1149 views
0

我有一個JSON列,我想創建一個準備好的語句,但我不知道如何去做,因爲該語句的參數是在一個文字字符串中。如何在java中爲mysql使用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); 
} 

任何人有什麼建議?

+0

我想你應該把一個字符串作爲參數傳遞給JSON_SET函數 - 畢竟它和其他函數沒有什麼不同:'JSON_SET(new_friends,?,?)'。在這種情況下,對於第一個佔位符,您將傳遞「$ .whatever」的值,對於第二個 - 「[1,2,3,4,5]」。請注意,這些應該是字符串。至少試一試。 –

+0

查看MySQL文檔後,會看到一組與JSON相關的函數可用,也許在您向數組中添加新值的情況下可以使用'JSON_ARRAY_APPEND'。 https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.html –

回答

1

?佔位符不像字符串插值一樣使用。他們替代整個參數。當函數參數是一個字符串時,整個參數必須是文字字符串或使用SQL字符串函數構建,並將參數作爲更多參數。

假設你的語法是正確的,你想達到什麼樣的,考慮這些:

JSON_SET(new_friends, '$.?', '[?]') -- not valid 
JSON_SET(new_friends, ?, ?) -- valid 
JSON_SET(new_friends, CONCAT('$.',?), CONCAT('[',?,']')) -- valid 

參數1將在2號線的風格在被設置爲字符串$.foo了上面的查詢,或foo

您的版本無效的原因正是您不使用類似WHERE username = '?'之類的原因而是使用WHERE username = ?(在?附近沒有引號)的原因。

+0

謝謝!我現在要試試這個。這是否也適用於數值? – Edmond