Java中的BaseTypeHandler自定义类型转换器如何使用
作者:FreshDream
时间:2023-04-29
浏览:3
简述mysq5.7之后新增了json类型,但是在使用的过程中,Json数组中的值小于Integer.MAX_VALUE,则反序列化时会转成List类型,假设我们用的是List类型的话就会碰到类型转换错误的异常。通用的类型转换器(存在一些问题)此方法可以返回对象的calss,自动转成对应的类型,但是在碰到List类型的时候,由于calss只能获取到java.util.List类型无法获取List里对象的类型,就会导致会使用fastJson的默认转换类型,也就是当Json数组中的值小于Integer.MAX_
简述
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 JsonTypeHandlerextends 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; } }
作者最新文章
photoshop路径选择工具在哪
2026-10-02 13:28
3dmax建筑建模算量不认可吗?不认可怎么办及软件选择指南
2026-10-01 11:09
vivo V80 曝光:10月发布,首推10倍人像变焦与蔡司夜景长焦
2026-09-08 17:00
PDF转Excel操作指南:极轻PDF在线工具使用步骤与结果核对
2026-09-02 19:02
Blender 3D动画制作入门:绑定、关键帧、灯光与渲染全流程
2026-09-02 11:10
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多










































