Heim  >  Artikel  >  Java  >  So verwenden Sie den benutzerdefinierten Typkonverter BaseTypeHandler in Java

So verwenden Sie den benutzerdefinierten Typkonverter BaseTypeHandler in Java

WBOY
WBOYnach vorne
2023-04-29 09:46:062019Durchsuche

Kurze Beschreibung

Der JSON-Typ wurde nach mysq5.7 hinzugefügt. Wenn der Wert im JSON-Array jedoch kleiner als Integer.MAX_VALUE ist, wird er während der Deserialisierung in den von uns verwendeten List-Typ konvertiert Wenn dies der Fall ist, wird eine Typkonvertierungsfehlerausnahme auftreten.

Universeller Typkonverter (es gibt einige Probleme)

Diese Methode kann den Calss des Objekts zurückgeben und ihn automatisch in den entsprechenden Typ konvertieren. Wenn der Calss jedoch auf den List-Typ stößt, kann er nur die java.util.List abrufen Wenn der Typ des Objekts in der Liste nicht ermittelt werden kann, wird der Standardkonvertierungstyp fastJson verwendet. Das heißt, wenn der Wert im Json-Array kleiner als Integer.MAX_VALUE ist, wird er in den Listentyp konvertiert während der Deserialisierung. Wenn Sie also auf diese Situation stoßen, können Sie die folgende Methode verwenden.

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

Benutzerdefinierter Typkonverter

Der angegebene Rückgabewert kann nur Liste sein

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

Das obige ist der detaillierte Inhalt vonSo verwenden Sie den benutzerdefinierten Typkonverter BaseTypeHandler in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen