Mybatis實現(xiàn)自定義類型轉(zhuǎn)換器TypeHandler的方法
先給大家簡單介紹下mybatis
MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及對結(jié)果集的檢索封裝。MyBatis可以使用簡單的XML或注解用于配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄。
此文其實是java操作Oracle類型XMLType總結(jié)二:使用Mybatis附帶的一篇小結(jié)。
Mybatis實現(xiàn)自定義的轉(zhuǎn)換器,十分的簡單,其主要步驟分為三步,這里以操作XMLType類型為例。
第一步
新建一個轉(zhuǎn)換類,實現(xiàn)TypeHandler接口,接口的泛型指定參數(shù)類型,不指定則為Object:
public class XmltypeTypeHandler implements TypeHandler<String>
該接口主要有以下4個方法:
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) public String getResult(ResultSet rs, String columnName) throws SQLException public String getResult(ResultSet rs, int columnIndex) throws SQLException public String getResult(CallableStatement cs, int columnIndex) throws SQLException
方法的作用看名字應(yīng)該就能明白,setParameter是傳入?yún)?shù)時的操作,在參數(shù)傳入到數(shù)據(jù)庫前需要做加工處理的代碼,可以寫在該方法內(nèi),其它三個均為獲取查詢結(jié)果方法,在得到j(luò)dbc的查詢結(jié)果后可以轉(zhuǎn)換為任意你想要的類型。
第二步
在mapper-config中,注冊你實現(xiàn)的轉(zhuǎn)換器類,其中jdbcType可以指定的類型在Mybatis的枚舉類org.apache.ibatis.type.JdbcType中有明確的定義,不能為該枚舉以外的值,不然會出錯。這里因為枚舉中沒有我們需要的XMLType類型,所以指定為UNDEFINED。(也可以不指定具體的類型,在使用時用typeHandler指定具體的類即可):
<typeHandlers> <typeHandler javaType="string" jdbcType="UNDEFINED" handler="com.tyyd.dw.context.XmltypeTypeHandler"/> </typeHandlers>
第三步
在你的mapper映射文件中使用類型轉(zhuǎn)換器:
insert into T_Content( <include refid="fullColumns"/> ) values ( #{controlId,jdbcType=BIGINT}, #{xmlFile,javaType=string,jdbcType=UNDEFINED,typeHandler=com.tyyd.dw.context.XmltypeTypeHandler}, #{drmFile,jdbcType=BLOB} )
注意傳入的xmlFile參數(shù),指定了javaType、jdbcType和typeHandler,表明我們要使用哪個類型處理器,當然你也可以只指定其中的某一項,但是該項存在必須唯一,如果一模一樣存在多個又指定不清晰的話,Mybatis會因為不能進行區(qū)分而出現(xiàn)錯誤。
至此,一個mybatis的自定義類型轉(zhuǎn)換器就實現(xiàn)完成了,需要注意的是,上面指定的類型處理器僅在插入數(shù)據(jù)時起作用,想要在查詢時也使用自定義的類型處理器,需要在resultMap內(nèi)屬性的標簽中進行指定,其指定的標簽javaType、jdbcType和typeHandler名稱和使用方式都是一樣的,這里就不再贅述。
附上完整的類型轉(zhuǎn)換器代碼,因為XMLType類型要查詢時,可以使用數(shù)據(jù)庫的xmltype.getclobval()直接返回當成string來操作,所以返回的方法都沒有進行特殊處理。(也可以使用xmltype.getstringval()函數(shù)返回string,但在實際使用過程中發(fā)現(xiàn)當字段為null時,getstringval()會出現(xiàn)ORA-06502:numeric or value error:character string buffer too small的錯誤,getclobval()則不會出現(xiàn)錯誤,所以推薦使用getclobval()函數(shù)):
/** * oracle SYS.XMLTYPE 類型自定義處理器 * * User: liyd * Date: 13-12-27 * Time: 下午4:53 */ public class XmltypeTypeHandler implements TypeHandler<String> { @Override public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { //防止為null時,創(chuàng)建XMLType出現(xiàn)錯誤 if (StringUtils.isNotBlank(parameter)) { DelegatingConnection connection = (DelegatingConnection) ps.getConnection() .getMetaData().getConnection(); XMLType xmltype = XMLType.createXML(connection.getDelegate(), parameter); ps.setObject(i, xmltype); } else { ps.setString(i, null); } } @Override public String getResult(ResultSet rs, String columnName) throws SQLException { //數(shù)據(jù)庫sql查詢時xmltype字段使用xmltype.getclobval()返回 return rs.getString(columnName); } @Override public String getResult(ResultSet rs, int columnIndex) throws SQLException { return rs.getString(columnIndex); } @Override public String getResult(CallableStatement cs, int columnIndex) throws SQLException { return cs.getString(columnIndex); } }
以上所述是小編給大家介紹的Mybatis實現(xiàn)自定義類型轉(zhuǎn)換器TypeHandler的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringBoot整合Mybatis注解開發(fā)的實現(xiàn)代碼
這篇文章主要介紹了SpringBoot整合Mybatis注解開發(fā)的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Springboot中@RequestParam和@PathVariable的用法與區(qū)別詳解
這篇文章主要介紹了Springboot中@RequestParam和@PathVariable的用法與區(qū)別詳解,RESTful API設(shè)計的最佳實踐是使用路徑參數(shù)來標識一個或多個特定資源,而使用查詢參數(shù)來對這些資源進行排序/過濾,需要的朋友可以參考下2024-01-01在Spring Boot中使用Spark Streaming進行實時數(shù)據(jù)處理和流式計算的步驟
這篇文章主要介紹了在Spring Boot中使用Spark Streaming進行實時數(shù)據(jù)處理和流式計算,通過本文的介紹,我們了解了在Spring Boot中使用Spark Streaming進行實時數(shù)據(jù)處理和流式計算的詳細步驟,需要的朋友可以參考下2024-03-03java遠程連接Linux執(zhí)行命令的3種方式完整代碼
在一些Java應(yīng)用程序中需要執(zhí)行一些Linux系統(tǒng)命令,例如服務(wù)器資源查看、文件操作等,這篇文章主要給大家介紹了關(guān)于java遠程連接Linux執(zhí)行命令的3種方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-06-06Mybatis-Plus3.x的創(chuàng)建步驟及使用教程
MyBatis-Plus是一個?MyBatis?的增強工具,在?MyBatis?的基礎(chǔ)上只做增強不做改變,為?簡化開發(fā)、提高效率而生,這篇文章主要介紹了Mybatis-Plus3.x的使用,需要的朋友可以參考下2023-10-10