91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中的BaseTypeHandler自定義類型轉換器如何使用

發布時間:2022-05-23 09:25:38 來源:億速云 閱讀:636 作者:iii 欄目:開發技術

這篇文章主要介紹“Java中的BaseTypeHandler自定義類型轉換器如何使用”,在日常操作中,相信很多人在Java中的BaseTypeHandler自定義類型轉換器如何使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中的BaseTypeHandler自定義類型轉換器如何使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

簡述

mysq5.7之后新增了json類型,但是在使用的過程中,Json數組中的值小于Integer.MAX_VALUE,則反序列化時會轉成List類型,假設我們用的是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自定義類型轉換器如何使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

溧阳市| 雷波县| 玉山县| 安平县| 肥城市| 绍兴市| 雷州市| 兰西县| 吴桥县| 汉阴县| 乳山市| 武安市| 错那县| 舒兰市| 六枝特区| 厦门市| 江达县| 获嘉县| 松桃| 集贤县| 怀化市| 密云县| 蒙城县| 柯坪县| 玛纳斯县| 台州市| 赣榆县| 宁乡县| 金阳县| 洛隆县| 衡阳县| 象山县| 富锦市| 横山县| 红河县| 布尔津县| 册亨县| 盱眙县| 三台县| 太湖县| 天柱县|