Rumah > Java > javaTutorial > teks badan

Cara menggunakan penukar jenis tersuai BaseTypeHandler dalam Java

WBOY
Lepaskan: 2023-04-29 09:46:06
ke hadapan
2063 orang telah melayarinya

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;
        }
    }
}
Salin selepas log masuk

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;
    }
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan