Rumah  >  Artikel  >  Java  >  Cara menggunakan penukar jenis tersuai BaseTypeHandler dalam Java

Cara menggunakan penukar jenis tersuai BaseTypeHandler dalam Java

WBOY
WBOYke hadapan
2023-04-29 09:46:062066semak imbas

Penerangan ringkas

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.

Penukar jenis universal (terdapat beberapa masalah)

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;
        }
    }
}

Penukar jenis tersuai

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam