文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-30 15:52

关注

这篇文章主要介绍“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自定义类型转换器如何使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯