Mybatis工具类JdbcTypeInterceptor运行时自动添加jdbcType属性

网友投稿 256 2023-01-16


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 (Method method : 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);

regixCOHkIiUJster(java.sql.Timestamp.class, JdbcType.TIMESTAMP);

register(Character.class, JdbcType.CHAR);

register(char.class, JdbcType.CHAR);

除了上面这些默认类型外,还可以通过参数进行配置。

参数代码:

@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(",");

xCOHkIiUJ 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枚举。

配置方式

特别注意,上面配置的两个参数只是示例,不要照抄,最简单的就是下面这样配置:

因为这个插件就一个类,所以有什么问题自己看源码解决,发现bug可以提!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot在生产快速禁用Swagger2的方法步骤
下一篇:实现接口重写方法的作用(实现接口必须重写类中的方法)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~