mysq5.7 이후에 json 유형이 추가되었습니다. 그러나 사용 중 Json 배열의 값이 Integer.MAX_VALUE보다 작으면 deserialization 중에 List 유형으로 변환됩니다. 목록 유형인 경우 유형 변환 오류 예외가 발생합니다.
이 메소드는 객체의 calss를 반환하고 자동으로 해당 유형으로 변환할 수 있습니다. 그러나 List 유형을 만나면 calss는 java.util.List만 얻을 수 있습니다. List의 객체 유형을 가져오지 못하면 기본 변환 유형인 fastJson이 사용됩니다. 즉, Json 배열의 값이 Integer.MAX_VALUE보다 작은 경우 List 유형으로 변환됩니다. 역직렬화 중. 따라서 이러한 상황이 발생하면 다음 방법을 사용할 수 있습니다.
@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; } } }
지정된 반환 값은 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; } }
위 내용은 Java에서 BaseTypeHandler 사용자 정의 유형 변환기를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!