jdbctypeinterceptor
運行時自動添加 jdbctype 屬性
攔截器簽名
1
2
3
4
5
6
|
@intercepts ({ @signature ( type = parameterhandler. class , method = "setparameters" , args = {preparedstatement. class }) }) |
這類攔截器很少見,所以和其他攔截器(如分頁插件)等搭配使用時不需要考慮順序。
這個插件最適合的場景可能就是 oracle 數據庫,可以自動給所有方法添加 jdbctype 屬性,避免 null 導致的錯誤。遇到這種情況時,你可以先嘗試配置 setting:
1
2
3
|
<settings> <setting name= "jdbctypefornull" value= "null" /> </settings> |
如果這個配置仍然無法解決你的問題,就可以試試jdbctype
插件。
說明,必看!
首先,這個插件默認情況下是適合通用 mapper 使用的!因為默認情況下,這個攔截器會處理所有繼承自mapper<t>
的方法,代碼如下:
1
2
3
4
5
|
//設置默認的方法,是用 mapper 所有方法 method[] methods = tk.mybatis.mapper.common.mapper. class .getmethods(); for (method method : methods) { methodset.add(method.getname()); } |
上面這是默認的方法,如果你不是用于通用mapper,建議去掉這段代碼,或者換成你自己的默認方法。
默認會自動根據java類型自動配置的jdbctype類型如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
//設置默認的類型轉換,參考 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 ); |
除了上面這些默認類型外,還可以通過參數進行配置。
參數代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@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); } } } //手動配置 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 ]); } } } } |
從代碼可以看到,支持下面兩個參數:
- methods:攔截的方法,如果配置為all,就會攔截所有的方法,你可以配置為方法名用逗號隔開的形式。
- typemaps:配置 java 到 jdbctype 的類型映射,使用如:java1:jdbctype1,java2:jdbctype2這種形式進行配置,java1代表具體的類型,要用全限定名稱方式。jdbctype 的值參考 org.apache.ibatis.type.jdbctype枚舉。
配置方式
1
2
3
4
5
6
|
<plugins> <plugin interceptor= "tk.mybatis.plugin.jdbctypeinterceptor" > <property name= "methods" value= "all" /> <property name= "typemaps" value= "java.lang.string:varchar" /> </plugin> </plugins> |
特別注意,上面配置的兩個參數只是示例,不要照抄,最簡單的就是下面這樣配置:
1
2
3
|
<plugins> <plugin interceptor= "tk.mybatis.plugin.jdbctypeinterceptor" /> </plugins> |
因為這個插件就一個類,所以有什么問題自己看源碼解決,發現bug可以提!
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/isea533/article/details/58307149