首页 热点 业界 科技快讯 数码 电子消费 通信 前沿动态 电商

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

2022-05-23 05:51:37 来源 : 软件开发网

目录

简述

通用的类型转换器(存在一些问题)

定制类型转换器

简述

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 extends BaseTypeHandler { private static ObjectMapper mapper = new ObjectMapper(); private Class clazz; public JsonTypeHandler(Class 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> { private static final ObjectMapper objectMapper = new ObjectMapper(); @Override public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, JSON.toJSONString(parameter)); } @Override public List getNullableResult(ResultSet rs, String columnName) throws SQLException { return this.getLongs(rs.getString(columnName)); } @Override public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return this.getLongs(rs.getString(columnIndex)); } @Override public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return this.getLongs(cs.getString(columnIndex)); } private List getLongs(String value) { if (StringUtils.hasText(value)) { try { CollectionType type = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, Long.class); Object o1 = objectMapper.readValue(value, type); List o = objectMapper.readValue(value, type); return o; } catch (JsonProcessingException e) { e.printStackTrace(); } } return null; }}

到此这篇关于Java中的BaseTypeHandler自定义类型转换器的使用的文章就介绍到这了,更多相关BaseTypeHandler内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!

标签: 反序列化 支持软件 希望大家

相关文章

最近更新
观焦点:超萌相机 2023-03-01 12:29:37
海南百货网 2023-03-01 12:13:44
焦点热讯:宜点充 2023-02-28 10:10:16
天天关注:小铺CEO 2023-02-28 10:07:13
【世界聚看点】KaFit 2023-02-28 09:31:37
葱天下 2023-02-28 09:17:03
渔界竞钓 2023-02-28 08:15:29
焦点快看:鲸奇视频 2023-02-28 06:30:37
环球热议:萝小逗 2023-02-27 23:25:49
简讯:小码公交 2023-02-27 23:16:12
彼岸花 2023-02-27 22:32:52
时时夺宝 2023-02-27 21:37:50
天天动态:袜之源 2023-02-27 21:29:50
天天资讯:AI空气 2023-02-27 20:19:46
世界时讯:绘读 2023-02-27 20:19:41
看点:一元得购 2023-02-27 19:26:28