Mybatis工具類JdbcTypeInterceptor運(yùn)行時(shí)自動(dòng)添加jdbcType屬性
JdbcTypeInterceptor
運(yùn)行時(shí)自動(dòng)添加 jdbcType 屬性
攔截器簽名
@Intercepts({ @Signature( type = ParameterHandler.class, method = "setParameters", args = {PreparedStatement.class}) })
這類攔截器很少見,所以和其他攔截器(如分頁(yè)插件)等搭配使用時(shí)不需要考慮順序。
這個(gè)插件最適合的場(chǎng)景可能就是 Oracle 數(shù)據(jù)庫(kù),可以自動(dòng)給所有方法添加 jdbcType 屬性,避免 null 導(dǎo)致的錯(cuò)誤。遇到這種情況時(shí),你可以先嘗試配置 setting:
<settings> <setting name="jdbcTypeForNull" value="NULL"/> </settings>
如果這個(gè)配置仍然無(wú)法解決你的問題,就可以試試JdbcType
插件。
說明,必看!
首先,這個(gè)插件默認(rèn)情況下是適合通用 Mapper 使用的!因?yàn)槟J(rèn)情況下,這個(gè)攔截器會(huì)處理所有繼承自Mapper<T>
的方法,代碼如下:
//設(shè)置默認(rèn)的方法,是用 Mapper 所有方法 Method[] methods = tk.mybatis.mapper.common.Mapper.class.getMethods(); for (Method method : methods) { methodSet.add(method.getName()); }
上面這是默認(rèn)的方法,如果你不是用于通用Mapper,建議去掉這段代碼,或者換成你自己的默認(rèn)方法。
默認(rèn)會(huì)自動(dòng)根據(jù)java類型自動(dòng)配置的jdbcType類型如下:
//設(shè)置默認(rèn)的類型轉(zhuǎn)換,參考 TypeHandlerRegistry register(Boolean.class, JdbcType.BOOLEAN); register(boolean.class, JdbcType.BOOLEAN); register(Byte.class, JdbcType.TINYINT); register(byte.class, JdbcType.TINYINT); register(Short.class, JdbcType.SMALLINT); register(short.class, JdbcType.SMALLINT); register(Integer.class, JdbcType.INTEGER); register(int.class, JdbcType.INTEGER); register(Long.class, JdbcType.BIGINT); register(long.class, JdbcType.BIGINT); register(Float.class, JdbcType.FLOAT); register(float.class, JdbcType.FLOAT); register(Double.class, JdbcType.DOUBLE); register(double.class, JdbcType.DOUBLE); register(String.class, JdbcType.VARCHAR); register(BigDecimal.class, JdbcType.DECIMAL); register(BigInteger.class, JdbcType.DECIMAL); register(Byte[].class, JdbcType.BLOB); register(byte[].class, JdbcType.BLOB); register(Date.class, JdbcType.DATE); register(java.sql.Date.class, JdbcType.DATE); register(java.sql.Time.class, JdbcType.TIME); register(java.sql.Timestamp.class, JdbcType.TIMESTAMP); register(Character.class, JdbcType.CHAR); register(char.class, JdbcType.CHAR);
除了上面這些默認(rèn)類型外,還可以通過參數(shù)進(jìn)行配置。
參數(shù)代碼:
@Override public void setProperties(Properties properties) { String methodStr = properties.getProperty("methods"); if (isNotEmpty(methodStr)) { //處理所有方法 if (methodStr.equalsIgnoreCase("ALL")) { methodSet.clear(); } else { String[] methods = methodStr.split(","); for (String method : methods) { methodSet.add(method); } } } //手動(dòng)配置 String typeMapStr = properties.getProperty("typeMaps"); if (isNotEmpty(typeMapStr)) { String[] typeMaps = typeMapStr.split(","); for (String typeMap : typeMaps) { String[] kvs = typeMap.split(":"); if (kvs.length == 2) { register(kvs[0], kvs[1]); } } } }
從代碼可以看到,支持下面兩個(gè)參數(shù):
- methods:攔截的方法,如果配置為ALL,就會(huì)攔截所有的方法,你可以配置為方法名用逗號(hào)隔開的形式。
- typeMaps:配置 java 到 jdbcType 的類型映射,使用如:java1:jdbcType1,java2:jdbcType2這種形式進(jìn)行配置,java1代表具體的類型,要用全限定名稱方式。jdbcType 的值參考 org.apache.ibatis.type.JdbcType枚舉。
配置方式
<plugins> <plugin interceptor="tk.mybatis.plugin.JdbcTypeInterceptor"> <property name="methods" value="ALL"/> <property name="typeMaps" value="java.lang.String:VARCHAR"/> </plugin> </plugins>
特別注意,上面配置的兩個(gè)參數(shù)只是示例,不要照抄,最簡(jiǎn)單的就是下面這樣配置:
<plugins> <plugin interceptor="tk.mybatis.plugin.JdbcTypeInterceptor"/> </plugins>
因?yàn)檫@個(gè)插件就一個(gè)類,所以有什么問題自己看源碼解決,發(fā)現(xiàn)bug可以提!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
spring boot攔截器實(shí)現(xiàn)IP黑名單實(shí)例代碼
本篇文章主要介紹了spring boot攔截器實(shí)現(xiàn)IP黑名單實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Spring的@Value如何從Nacos配置中心獲取值并自動(dòng)刷新
這篇文章主要介紹了Spring的@Value如何從Nacos配置中心獲取值并自動(dòng)刷新,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Netty啟動(dòng)流程服務(wù)端channel初始化源碼分析
這篇文章主要為大家介紹了Netty啟動(dòng)流程服務(wù)端channel初始化源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03java awt實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了java awt實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12JDBC程序更新數(shù)據(jù)庫(kù)中記錄的方法
這篇文章主要介紹了JDBC程序更新數(shù)據(jù)庫(kù)中記錄的方法,涉及Java基于JDBC操作數(shù)據(jù)庫(kù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10mybatis打印SQL,并顯示參數(shù)的實(shí)例
這篇文章主要介紹了mybatis打印SQL,并顯示參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-12-12Java實(shí)現(xiàn)仿淘寶滑動(dòng)驗(yàn)證碼研究代碼詳解
這篇文章主要介紹了Java實(shí)現(xiàn)仿淘寶滑動(dòng)驗(yàn)證碼研究代碼詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06