Java中的BaseTypeHandler自定義類型轉(zhuǎn)換器的使用
簡(jiǎn)述
mysq5.7之后新增了json類型,但是在使用的過程中,Json數(shù)組中的值小于Integer.MAX_VALUE,則反序列化時(shí)會(huì)轉(zhuǎn)成List類型,假設(shè)我們用的是List類型的話就會(huì)碰到類型轉(zhuǎn)換錯(cuò)誤的異常。
通用的類型轉(zhuǎn)換器(存在一些問題)
此方法可以返回對(duì)象的calss,自動(dòng)轉(zhuǎn)成對(duì)應(yīng)的類型,但是在碰到List 類型的時(shí)候,由于calss只能獲取到j(luò)ava.util.List類型無法獲取List里對(duì)象的類型,就會(huì)導(dǎo)致會(huì)使用fastJson的默認(rèn)轉(zhuǎn)換類型,也就是當(dāng)Json數(shù)組中的值小于Integer.MAX_VALUE,則反序列化時(shí)會(huì)轉(zhuǎn)成List類型。所以當(dāng)碰到這種情況時(shí),可以使用以下方法。
@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;
}
}
}定制類型轉(zhuǎn)換器
指定返回值只能是 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;
}
}到此這篇關(guān)于Java中的BaseTypeHandler自定義類型轉(zhuǎn)換器的使用的文章就介紹到這了,更多相關(guān)BaseTypeHandler內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring+SpringMVC+MyBatis整合實(shí)戰(zhàn)(SSM框架)
框架整合難不難?難!東西多,配置文件復(fù)雜不好記憶,本文就來介紹一下Spring+SpringMVC+MyBatis整合實(shí)戰(zhàn),具有一定的參考價(jià)值,感興趣的可以了解一下2021-08-08
idea啟動(dòng)項(xiàng)目提示端口占用的問題解決
有時(shí)候當(dāng)我們使用Tomcat啟動(dòng)web項(xiàng)目時(shí),會(huì)提示端口占用,導(dǎo)致啟動(dòng)失敗,本文就來介紹一下端口占用的解決方法,具有一定的參考價(jià)值,感興趣的可以了解下2023-08-08
Java Set集合及其子類HashSet與LinkedHashSet詳解
這篇文章主要介紹了Java Set集合及其子類HashSet與LinkedHashSet詳解,文章通過Set集合存儲(chǔ)原理展開文章主題相關(guān)介紹,感興趣的小伙伴可以參考一下2022-06-06
java如何實(shí)現(xiàn)嵌套對(duì)象轉(zhuǎn)大map(扁平化)
這篇文章主要介紹了java如何實(shí)現(xiàn)嵌套對(duì)象轉(zhuǎn)大map(扁平化),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
使用ServletInputStream在攔截器或過濾器中應(yīng)用后重寫
這篇文章主要介紹了使用ServletInputStream在攔截器或過濾器中應(yīng)用后重寫,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
spring的pointcut正則表達(dá)式的實(shí)現(xiàn)
本文主要介紹了spring的pointcut正則表達(dá)式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
MyBatis啟動(dòng)時(shí)控制臺(tái)無限輸出日志的原因及解決辦法
這篇文章主要介紹了MyBatis啟動(dòng)時(shí)控制臺(tái)無限輸出日志的原因及解決辦法的相關(guān)資料,需要的朋友可以參考下2016-07-07
Java算法實(shí)現(xiàn)調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)之前的講解
今天小編就為大家分享一篇關(guān)于Java算法實(shí)現(xiàn)調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)之前的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01

