Mybatis工具类JdbcTypeInterceptor运行时自动添加jdbcType属性
JdbcTypeInterceptor
运行时自动添加jdbcType属性
拦截器签名
@Intercepts({ @Signature( type=ParameterHandler.class, method="setParameters", args={PreparedStatement.class}) })
这类拦截器很少见,所以和其他拦截器(如分页插件)等搭配使用时不需要考虑顺序。
这个插件最适合的场景可能就是Oracle数据库,可以自动给所有方法添加jdbcType属性,避免null导致的错误。遇到这种情况时,你可以先尝试配置setting:
如果这个配置仍然无法解决你的问题,就可以试试JdbcType插件。
说明,必看!
首先,这个插件默认情况下是适合通用Mapper使用的!因为默认情况下,这个拦截器会处理所有继承自Mapper
//设置默认的方法,是用Mapper所有方法 Method[]methods=tk.mybatis.mapper.common.Mapper.class.getMethods(); for(Methodmethod:methods){ methodSet.add(method.getName()); }
上面这是默认的方法,如果你不是用于通用Mapper,建议去掉这段代码,或者换成你自己的默认方法。
默认会自动根据java类型自动配置的jdbcType类型如下:
//设置默认的类型转换,参考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);
除了上面这些默认类型外,还可以通过参数进行配置。
参数代码:
@Override publicvoidsetProperties(Propertiesproperties){ StringmethodStr=properties.getProperty("methods"); if(isNotEmpty(methodStr)){ //处理所有方法 if(methodStr.equalsIgnoreCase("ALL")){ methodSet.clear(); }else{ String[]methods=methodStr.split(","); for(Stringmethod:methods){ methodSet.add(method); } } } //手动配置 StringtypeMapStr=properties.getProperty("typeMaps"); if(isNotEmpty(typeMapStr)){ String[]typeMaps=typeMapStr.split(","); for(StringtypeMap: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枚举。
配置方式
特别注意,上面配置的两个参数只是示例,不要照抄,最简单的就是下面这样配置:
因为这个插件就一个类,所以有什么问题自己看源码解决,发现bug可以提!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接