• 技术文章 >Java >java教程

    Java中的BaseTypeHandler自定义类型转换器如何使用

    WBOYWBOY2023-04-29 09:46:06转载30

    简述

    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自定义类型转换器如何使用的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:亿速云,如有侵犯,请联系admin@php.cn删除
    专题推荐:Java
    上一篇:JAVA开发中常用的工具有哪些 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • java中${}和#{}有哪些区别• java中力求故障原子性的示例分析• Java如何读取WEB应用中的资源• 在Java8中如何获取当前的时间戳• java中UDP怎么发送数据
    1/1

    PHP中文网