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自定義類型轉換器的使用的文章就介紹到這瞭,更多相關BaseTypeHandler內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Mybatis的類型轉換接口TypeHandler
- MyBatisPlus TypeHandler自定義字段類型轉換Handler
- 解決mybatis plus字段為null或空字符串無法保存到數據庫的問題
- MybatisPlus如何自定義TypeHandler映射JSON類型為List
- 解決MyBatis中Enum字段參數解析問題