Mybatis 自定義類型處理器示例詳解
前言
在某些情況下我們需要對類型做處理。
例如數(shù)據(jù)存儲的是Long
。程序里是BigDecimal
,那么我們出庫入庫都需要做處理。此時就可以使用類型處理器
我們從@TableFiel
入手,其中有一個字段typeHandler
如下圖
對于注釋上的建議事實(shí)也確實(shí)如此,如果我們在
xml
中沒有定義這個實(shí)體的ResultMap
那么需要將autoResultMap
賦值為ture
要求類型是TypeHandler
的實(shí)現(xiàn)類即可。
我們看到實(shí)際上已經(jīng)有很多的類型處理器了
它們都是一些默認(rèn)的類型處理器,下面是官網(wǎng)的解釋
mybatis – MyBatis 3 | 配置
BaseTypeHandler
我們可以繼承BaseTypeHandler
,來自定義一個類型處理器。
/** * @author YinShangwen * @since 2023/10/16 9:36 */ // 指定 Java 類型 @MappedTypes({String.class}) // 指定 jdbc 類型 @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è)我們這里給入庫的字符串的末尾加上.ysw
的后綴
出庫的時候去除添加的后綴,完整代碼如下:
/** * @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
是對于json類型的處理器,繼承該類可以很方便的完成
具體代碼如下:
/** * @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); } }
使用
??注意:必須開啟@TableName(autoResultMap = true)
@TableField(typeHandler = StringTypeHandler.class)
<result column="demo_config" property="demoConfig" typeHandler="com.ysw.type_handler.LongMapJsonTypeHandler"/>
到此這篇關(guān)于Mybatis 自定義類型處理器的文章就介紹到這了,更多相關(guān)Mybatis 自定義類型處理器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot webflux 過濾器(使用RouterFunction實(shí)現(xiàn))
這篇文章主要介紹了springboot webflux 過濾器(使用RouterFunction實(shí)現(xiàn)),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Java排序算法三之歸并排序的遞歸與非遞歸的實(shí)現(xiàn)示例解析
這篇文章主要介紹了Java排序算法三之歸并排序的遞歸與非遞歸的實(shí)現(xiàn)示例解析,文章通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Spring自動裝配之方法、構(gòu)造器位置的自動注入操作
這篇文章主要介紹了Spring自動裝配之方法、構(gòu)造器位置的自動注入操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08SpringBoot整合MongoDB實(shí)現(xiàn)文檔存儲功能
MongoDB是可以應(yīng)用于各種規(guī)模的企業(yè)、各個行業(yè)以及各類應(yīng)用程序的開源數(shù)據(jù)庫,本文將結(jié)合MongoDB和SpringBoot實(shí)現(xiàn)文檔存儲功能,需要的可以參考下2024-12-12Java Netty HTTP服務(wù)實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java Netty HTTP服務(wù)實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08springboot的EnvironmentPostProcessor接口方法源碼解析
這篇文章主要介紹了springboot的EnvironmentPostProcessor接口方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08