Mybatis 自定義類(lèi)型處理器示例詳解
前言
在某些情況下我們需要對(duì)類(lèi)型做處理。
例如數(shù)據(jù)存儲(chǔ)的是Long。程序里是BigDecimal,那么我們出庫(kù)入庫(kù)都需要做處理。此時(shí)就可以使用類(lèi)型處理器
我們從@TableFiel入手,其中有一個(gè)字段typeHandler如下圖

對(duì)于注釋上的建議事實(shí)也確實(shí)如此,如果我們?cè)?code>xml中沒(méi)有定義這個(gè)實(shí)體的
ResultMap那么需要將autoResultMap賦值為ture
要求類(lèi)型是TypeHandler的實(shí)現(xiàn)類(lèi)即可。

我們看到實(shí)際上已經(jīng)有很多的類(lèi)型處理器了

它們都是一些默認(rèn)的類(lèi)型處理器,下面是官網(wǎng)的解釋
mybatis – MyBatis 3 | 配置
BaseTypeHandler
我們可以繼承BaseTypeHandler,來(lái)自定義一個(gè)類(lèi)型處理器。
/**
* @author YinShangwen
* @since 2023/10/16 9:36
*/
// 指定 Java 類(lèi)型
@MappedTypes({String.class})
// 指定 jdbc 類(lèi)型
@MappedJdbcTypes({JdbcType.VARCHAR})
public class StringTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
// 設(shè)置值
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
// 獲得值
return null;
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
// 獲得值
return null;
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
// 獲得值
return null;
}
}假設(shè)我們這里給入庫(kù)的字符串的末尾加上.ysw的后綴
出庫(kù)的時(shí)候去除添加的后綴,完整代碼如下:
/**
* @author YinShangwen
* @since 2023/10/16 9:36
*/
@MappedTypes({String.class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class StringTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
if (StringUtils.isNotBlank(parameter)) {
ps.setString(i, parameter + ".ysw");
}
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
String ret = rs.getString(columnName);
return ret != null ? ret.substring(0, ret.length() - 4) : null;
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String ret = rs.getString(columnIndex);
return ret != null ? ret.substring(0, ret.length() - 4) : null;
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String ret = cs.getString(columnIndex);
return ret != null ? ret.substring(0, ret.length() - 4) : null;
}
}AbstractJsonTypeHandler
AbstractJsonTypeHandler是對(duì)于json類(lèi)型的處理器,繼承該類(lèi)可以很方便的完成
具體代碼如下:
/**
* @author YinShangwen
* @since 2023/10/16 8:55
*/
@MappedTypes({Map.class})
@MappedJdbcTypes({JdbcType.JAVA_OBJECT})
public class LongMapJsonTypeHandler extends AbstractJsonTypeHandler<Map<Long, List<Demo>>> {
@Override
protected Map<Long, List<Demo>> parse(String json) {
return JSON.parseObject(json, new TypeReference<Map<Long, List<RangeConfigDTO>>>() {
});
}
@Override
protected String toJson(Map<Long, List<Demo>> obj) {
return JSON.toJSONString(obj);
}
}使用
??注意:必須開(kāi)啟@TableName(autoResultMap = true)
@TableField(typeHandler = StringTypeHandler.class)
<result column="demo_config" property="demoConfig" typeHandler="com.ysw.type_handler.LongMapJsonTypeHandler"/>
到此這篇關(guān)于Mybatis 自定義類(lèi)型處理器的文章就介紹到這了,更多相關(guān)Mybatis 自定義類(lèi)型處理器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaMail實(shí)現(xiàn)帶附件的郵件發(fā)送
這篇文章主要為大家詳細(xì)介紹了JavaMail實(shí)現(xiàn)帶附件的郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Mybatis-plus獲取雪花算法生成的ID并返回生成ID
本文主要介紹了Mybatis-plus獲取雪花算法生成的ID并返回生成ID,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09
java如何動(dòng)態(tài)的處理接口的返回?cái)?shù)據(jù)
本文主要介紹了java如何動(dòng)態(tài)的處理接口的返回?cái)?shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
rabbitmq的消息持久化處理開(kāi)啟,再關(guān)閉后,消費(fèi)者啟動(dòng)報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了rabbitmq的消息持久化處理開(kāi)啟,再關(guān)閉后,消費(fèi)者啟動(dòng)報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Java使用Javassist動(dòng)態(tài)生成HelloWorld類(lèi)
Javassist是一個(gè)非常強(qiáng)大的字節(jié)碼操作和定義庫(kù),它允許開(kāi)發(fā)者在運(yùn)行時(shí)創(chuàng)建新的類(lèi)或者修改現(xiàn)有的類(lèi),本文將簡(jiǎn)單介紹如何使用Javassist動(dòng)態(tài)生成HelloWorld類(lèi),需要的可以了解下2025-09-09
基于CyclicBarrier和CountDownLatch的使用區(qū)別說(shuō)明
這篇文章主要介紹了基于CyclicBarrier和CountDownLatch的使用區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Java Morris遍歷算法及其在二叉樹(shù)中的應(yīng)用
Morris遍歷是一種基于線索二叉樹(shù)的遍歷算法,可以在不使用棧或遞歸的情況下,實(shí)現(xiàn)二叉樹(shù)的前序、中序和后序遍歷。該算法利用二叉樹(shù)中的空指針或線索指針,將遍歷序列嵌入到原二叉樹(shù)中,實(shí)現(xiàn)了常數(shù)級(jí)別的空間復(fù)雜度,適用于對(duì)空間要求較高的場(chǎng)景2023-04-04

