Le type json a été ajouté après mysq5.7, mais lors de l'utilisation, si la valeur dans le tableau Json est inférieure à Integer.MAX_VALUE, elle sera convertie en List lors de la désérialisation Tapez, en supposant que nous utilisons le type List, nous rencontrerons une exception d’erreur de conversion de type.
Cette méthode peut renvoyer le cals de l'objet et le convertir automatiquement au type correspondant, mais lorsqu'il rencontre le type List, Étant donné que calss ne peut obtenir que le type java.util.List et ne peut pas obtenir le type de l'objet dans la liste, le type de conversion par défaut fastJson sera utilisé lorsque la valeur du tableau Json est inférieure à Integer.MAX_VALUE. , il sera désérialisé. Convertir en type Liste. Ainsi, lorsque vous rencontrez cette situation, vous pouvez utiliser la méthode suivante.
@MappedJdbcTypes(value = JdbcType.VARCHAR) public class JsonTypeHandler<T extends Object> extends BaseTypeHandler<T> { private static ObjectMapper mapper = new ObjectMapper(); private Class<T> clazz; public JsonTypeHandler(Class<T> clazz) { if (clazz == null) { throw new IllegalArgumentException("Type argument cannot be null"); } this.clazz = clazz; } @Override public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, this.toJson(parameter)); } @Override public T getNullableResult(ResultSet rs, String columnName) throws SQLException { return this.toObject(rs.getString(columnName), clazz); } @Override public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return this.toObject(rs.getString(columnIndex), clazz); } @Override public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return this.toObject(cs.getString(columnIndex), clazz); } private String toJson(T object) { try { return mapper.writeValueAsString(object); } catch (Exception e) { throw new RuntimeException(e); } } private T toObject(String content, Class<?> clazz) { if (content != null && !content.isEmpty()) { try { return (T) mapper.readValue(content, clazz); } catch (Exception e) { throw new RuntimeException(e); } } else { return null; } } }
La valeur de retour spécifiée ne peut être que List
@MappedJdbcTypes(value = JdbcType.VARCHAR) @MappedTypes(List.class) public class JsonListLongTypeHandler extends BaseTypeHandler<List<Long>> { private static final ObjectMapper objectMapper = new ObjectMapper(); @Override public void setNonNullParameter(PreparedStatement ps, int i, List<Long> parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, JSON.toJSONString(parameter)); } @Override public List<Long> getNullableResult(ResultSet rs, String columnName) throws SQLException { return this.getLongs(rs.getString(columnName)); } @Override public List<Long> getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return this.getLongs(rs.getString(columnIndex)); } @Override public List<Long> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return this.getLongs(cs.getString(columnIndex)); } private List<Long> getLongs(String value) { if (StringUtils.hasText(value)) { try { CollectionType type = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, Long.class); Object o1 = objectMapper.readValue(value, type); List<Long> o = objectMapper.readValue(value, type); return o; } catch (JsonProcessingException e) { e.printStackTrace(); } } return null; } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!