Tengo un objeto JSON que inserto en mi base de datos MySQL.
ps = con.prepareStatement("INSERT INTO tableA(a, b, c, d_json)" +
" VALUES(?,?,?,cast(? AS JSON))", Statement.RETURN_GENERATED_KEYS);
// some code
ps.setObject(4, jsonValue);
Inserto un hashmap de cadena como:
Map<String, String> map = new HashMap<String, String>();
map.put("key", "value");
map.put("key1", "value1");
map.put("key2", "value2");
Sin embargo, el json se codifica de la siguiente manera:
''.
Me gustaría insertar una cadena en lugar de esto. Vi algunas publicaciones en S.O pero no encontré ninguna forma adecuada de solucionarlo. Cualquier ayuda sería apreciada. Gracias !
2 respuestas
No puede escribir directamente un objeto Java en MySQL; debe convertir su mapa a una cadena JSON antes de escribirlo en la columna de la tabla. Según los docs: " Intentar insertar un valor en una columna JSON tiene éxito si el valor es un valor JSON válido, pero falla si no lo es ".
Aquí hay un ejemplo (Jackson):
import com.fasterxml.jackson.databind.ObjectMapper;
public class Test {
private static final ObjectMapper objectMapper = new ObjectMapper();
public static String toJSON(Map<String, String> map) throws JsonProcessingException {
return objectMapper.writeValueAsString(map);
}
}
Otra opción sería crear una columna adicional, e , y luego simplemente escribir el mapa en dos columnas: map(k,v) => d(k), e(v)
El controlador Java Mysql no admite la conversión automática de Hashmaps. De hecho, si utiliza un tipo desconocido en setObject
, utilizará la serialización Java predeterminada para convertirlo en algo que pueda manejar. La base de datos recibe una matriz de bytes que contiene el HashMap serializado. cast(? as JSON)
convierte eso en algo que se puede almacenar en la columna, que es la matriz de bytes codificada BASE64.
Debe convertir su HashMap a una cadena JSON en su código Java antes de enviarlo a la base de datos.
Preguntas relacionadas
Nuevas preguntas
java
Java es un lenguaje de programación de alto nivel. Utilice esta etiqueta cuando tenga problemas para usar o comprender el idioma en sí. Esta etiqueta rara vez se usa sola y se usa con mayor frecuencia junto con [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] y [maven].