Rumah >Java >javaTutorial >Cara menggunakan penukar jenis tersuai BaseTypeHandler dalam Java
Jenis json telah ditambahkan selepas mysq5.7 Walau bagaimanapun, semasa penggunaan, jika nilai dalam tatasusunan Json kurang daripada Integer.MAX_VALUE, ia akan ditukar kepada jenis Senarai semasa penyahserilan. . Andaikan Jika kami menggunakan jenis Senarai, kami akan menghadapi pengecualian ralat penukaran jenis.
Kaedah ini boleh mengembalikan calss objek dan secara automatik menukarnya kepada jenis yang sepadan Walau bagaimanapun, apabila menghadapi jenis Senarai, sejak calss Hanya boleh Mendapatkan jenis java.util.List tidak boleh mendapatkan jenis objek dalam Senarai, yang akan menyebabkan jenis penukaran lalai fastJson digunakan, iaitu apabila nilai dalam tatasusunan Json kurang daripada Integer.MAX_VALUE , ia akan ditukar kepada jenis Senarai semasa penyahserikatan. Jadi apabila anda menghadapi situasi ini, anda boleh menggunakan kaedah berikut.
@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; } } }
Nilai pulangan yang ditentukan hanya boleh menjadi Senarai
@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; } }
Atas ialah kandungan terperinci Cara menggunakan penukar jenis tersuai BaseTypeHandler dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!