JdbcTypeInterceptor
運行時自動添加 jdbcType 屬性
攔截器簽名
@Intercepts({ @Signature( type = ParameterHandler.class, method = "setParameters", args = {PreparedStatement.class})})
這類攔截器很少見,所以和其他攔截器(如分頁插件)等搭配使用時不需要考慮順序。
這個插件最適合的場景可能就是 Oracle 數(shù)據(jù)庫,可以自動給所有方法添加 jdbcType 屬性,避免 null 導致的錯誤。遇到這種情況時,你可以先嘗試配置 setting:
<settings> <setting name="jdbcTypeForNull" value="NULL"/></settings>
如果這個配置仍然無法解決你的問題,就可以試試JdbcType
插件。
說明,必看!
首先,這個插件默認情況下是適合通用 Mapper 使用的!因為默認情況下,這個攔截器會處理所有繼承自Mapper<T>
的方法,代碼如下:
//設置默認的方法,是用 Mapper 所有方法Method[] methods = tk.mybatis.mapper.common.Mapper.class.getMethods();for (Method method : methods) { methodSet.add(method.getName());}
上面這是默認的方法,如果你不是用于通用Mapper,建議去掉這段代碼,或者換成你自己的默認方法。
默認會自動根據(jù)java類型自動配置的jdbcType類型如下:
//設置默認的類型轉換,參考 TypeHandlerRegistryregister(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);
除了上面這些默認類型外,還可以通過參數(shù)進行配置。
參數(shù)代碼:
@Overridepublic 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]); } } }}
從代碼可以看到,支持下面兩個參數(shù):
配置方式
<plugins> <plugin interceptor="tk.mybatis.plugin.JdbcTypeInterceptor"> <property name="methods" value="ALL"/> <property name="typeMaps" value="java.lang.String:VARCHAR"/> </plugin></plugins>
特別注意,上面配置的兩個參數(shù)只是示例,不要照抄,最簡單的就是下面這樣配置:
<plugins> <plugin interceptor="tk.mybatis.plugin.JdbcTypeInterceptor"/></plugins>
因為這個插件就一個類,所以有什么問題自己看源碼解決,發(fā)現(xiàn)bug可以提!
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網(wǎng)的支持。
新聞熱點
疑難解答
圖片精選