MyBatis中的自定義TypeHandler詳解
要實(shí)現(xiàn) typeHandler 就需要去實(shí)現(xiàn)接口 typeHandler,或者繼承 BaseTypeHandler(實(shí)際上,BaseTypeHandler 實(shí)現(xiàn)了 typeHandler 接口)。
自定義String類(lèi)型的TypeHandler:
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.log4j.Logger;
public class MyTypeHandler implements TypeHandler<String> {
Logger logger = Logger.getLogger(MyTypeHandler.class);
@Override
public void setParameter(PreparedStatement ps, int i, String parameter,
JdbcType jdbcType) throws SQLException {
logger.info("設(shè)置 string 參數(shù)【" + parameter + "】");
ps.setString(i, parameter);
}
@Override
public String getResult(ResultSet rs, String columnName)
throws SQLException {
String result = rs.getString(columnName);
logger.info("讀取 string 參數(shù) 1 【" + result + "】");
return result;
}
@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
String result = rs.getString(columnIndex);
logger.info("讀取string 參數(shù) 2【" + result + "】");
return result;
}
@Override
public String getResult(CallableStatement cs, int columnIndex)
throws SQLException {
String result = cs.getString(columnIndex);
logger.info("讀取 string 參數(shù) 3 【" + result + "】");
return result;
}
}定義的 typeHandler 泛型為 String,顯然我們要把數(shù)據(jù)庫(kù)的數(shù)據(jù)類(lèi)型轉(zhuǎn)化為 String 型,然后實(shí)現(xiàn)設(shè)置參數(shù)和獲取結(jié)果集的方法。
但是這個(gè)時(shí)候還沒(méi)有啟用 typeHandler
它還需要做如下所示的配置。
<typeHandlers>
<typeHandler jdbcType="VARCHAR" javaType="string" handler="com.mybatis.test.MyTypeHandler"/>
</typeHandlers>配置完成后系統(tǒng)才會(huì)讀取它,這樣注冊(cè)后,當(dāng) jdbcType 和 javaType 能與 MyTypeHandler 對(duì)應(yīng)的時(shí)候,它就會(huì)啟動(dòng) MyTypeHandler。
有時(shí)候還可以顯式啟用 typeHandler,一般而言啟用這個(gè) typeHandler 有兩種方式
如下所示。
....
<resultMap id="roleMapper" type="role">
<result property="id" column="id"/>
<result property="roleName" column="role_name" jdbcType="VARCHAR" javaType="string"/>
<result property="note" column="note" typeHandler=" com.mybatis.test.MyTypeHandler"/>
</resultMap>
<select id="getRole" parameterType="long" resultMap="roleMapper">
select id,role_name,note from t_role where id = #{id}
</select>
<select id="findRoles" parameterType="string" resultMap="roleMapper">
select id, role_name, note from t_role
where role_name like concat('%',#{roleName, jdbcType=VARCHAR,
javaType=string}, '%')
</select>
<select id="findRoles2" parameterType="string" resultMap="roleMapper">
select id, role_name, note from t_role
where note like concat ('%', # {note, typeHandler=com.mybatis.test.MyTypeHandler},'%')
</select>
......注意,要么指定了與自定義 typeHandler 一致的 jdbcType 和 javaType,要么直接使用 typeHandler 指定具體的實(shí)現(xiàn)類(lèi)。
在一些因?yàn)閿?shù)據(jù)庫(kù)返回為空導(dǎo)致無(wú)法斷定采用哪個(gè) typeHandler 來(lái)處理,而又沒(méi)有注冊(cè)對(duì)應(yīng)的 javaType 的 typeHandler 時(shí),MyBatis 無(wú)法知道使用哪個(gè) typeHandler 轉(zhuǎn)換數(shù)據(jù),我們可以采用這樣的方式來(lái)確定采用哪個(gè) typeHandler 處理,這樣就不會(huì)有異常出現(xiàn)了。
有時(shí)候由于枚舉類(lèi)型很多,系統(tǒng)需要的 typeHandler 也會(huì)很多,如果采用配置也會(huì)很麻煩,這個(gè)時(shí)候可以考慮使用包掃描的形式,那么就需要按照以下代碼配置了。
<typeHandlertype>
<package name="com.mybatis.test"/>
</typeHandlertype>只是這樣就沒(méi)法指定 jdbcType 和 javaType 了,不過(guò)我們可以使用注解來(lái)處理它們。我們把 MyTypeHandler 的聲明修改一下,如下所示。
@MappedTypes(String.class)
@MappedjdbcTypes(jdbcType.VARCHAR)
public class MyTypeHandler implements TypeHandler<String>{
......
}到此這篇關(guān)于MyBatis中的自定義TypeHandler詳解的文章就介紹到這了,更多相關(guān)MyBatis自定義TypeHandler內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis?typeHandler接口的定義和使用
- Mybatis中自定義TypeHandler處理枚舉的示例代碼
- Mybatis的TypeHandler實(shí)現(xiàn)數(shù)據(jù)加解密詳解
- Mybatis中TypeHandler使用小結(jié)
- SpringBoot中MyBatis使用自定義TypeHandler的實(shí)現(xiàn)
- Mybatis使用typeHandler加密的實(shí)現(xiàn)
- MyBatis-Plus?中?typeHandler?的使用實(shí)例詳解
- MyBatis中TypeHandler的使用教程詳解
- MyBatis類(lèi)型處理器TypeHandler的作用及說(shuō)明
- MyBatis自定義TypeHandler實(shí)現(xiàn)字段加密解密
相關(guān)文章
SpringBoot使用Redis的zset統(tǒng)計(jì)在線用戶信息
這篇文章主要介紹了SpringBoot使用Redis的zset統(tǒng)計(jì)在線用戶信息,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下2021-04-04
基于SpringAop中JoinPoint對(duì)象的使用說(shuō)明
這篇文章主要介紹了基于SpringAop中JoinPoint對(duì)象的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot web開(kāi)發(fā)源碼深入分析
Web開(kāi)發(fā)的核心內(nèi)容主要包括內(nèi)嵌的Servlet容器和SpringMVCSpringBoot使用起來(lái)非常簡(jiǎn)潔,大部分配置都有SpringBoot自動(dòng)裝配,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10
SpringBoot使用Redis單機(jī)版過(guò)期鍵監(jiān)聽(tīng)事件的實(shí)現(xiàn)示例
在緩存的使用場(chǎng)景中經(jīng)常需要使用到過(guò)期事件,本文主要介紹了SpringBoot使用Redis單機(jī)版過(guò)期鍵監(jiān)聽(tīng)事件的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
Java實(shí)現(xiàn)Windows計(jì)算器界面
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)Windows計(jì)算器界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
SpringBoot中的Spring Cloud Hystrix原理和用法詳解
在Spring Cloud中,Hystrix是一個(gè)非常重要的組件,Hystrix可以幫助我們構(gòu)建具有韌性的分布式系統(tǒng),保證系統(tǒng)的可用性和穩(wěn)定性,在本文中,我們將介紹SpringBoot中的Hystrix,包括其原理和如何使用,需要的朋友可以參考下2023-07-07
OpenFeign無(wú)法遠(yuǎn)程調(diào)用問(wèn)題及解決
文章介紹了在使用Feign客戶端時(shí)遇到的讀超時(shí)問(wèn)題,并分析了原因是系統(tǒng)啟動(dòng)時(shí)未先加載Nacos配置,為了解決這個(gè)問(wèn)題,建議將Nacos配置放在`bootstrap.yml`文件中,以便項(xiàng)目啟動(dòng)時(shí)優(yōu)先加載Nacos配置2024-11-11
史上最簡(jiǎn)單的MyBatis動(dòng)態(tài)SQL入門(mén)示例代碼
動(dòng)態(tài)sql,可以根據(jù)用戶對(duì)字段選擇和輸入,動(dòng)態(tài)生成一條sql執(zhí)行。接下來(lái)通過(guò)本文給大家分享MyBatis動(dòng)態(tài)SQL入門(mén)示例代碼,一起看看吧2017-03-03
SpringBoot詳解整合Spring?Cache實(shí)現(xiàn)Redis緩存流程
這篇文章主要介紹了SpringBoot整合Spring?Cache實(shí)現(xiàn)Redis緩存方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

