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

 更新时间:2018年12月26日 10:37:59   作者:isea533  
今天小编就为大家分享一篇关于Mybatis工具类JdbcTypeInterceptor运行时自动添加jdbcType属性,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

JdbcTypeInterceptor

运行时自动添加 jdbcType 属性

拦截器签名

@Intercepts({
    @Signature(
      type = ParameterHandler.class, 
      method = "setParameters", 
      args = {PreparedStatement.class})
})

这类拦截器很少见,所以和其他拦截器(如分页插件)等搭配使用时不需要考虑顺序。

这个插件最适合的场景可能就是 Oracle 数据库,可以自动给所有方法添加 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,建议去掉这段代码,或者换成你自己的默认方法。

默认会自动根据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
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枚举。

配置方式

<plugins>
  <plugin interceptor="tk.mybatis.plugin.JdbcTypeInterceptor">
    <property name="methods" value="ALL"/>
    <property name="typeMaps" value="java.lang.String:VARCHAR"/>
  </plugin>
</plugins>

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

<plugins>
  <plugin interceptor="tk.mybatis.plugin.JdbcTypeInterceptor"/>
</plugins>

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

总结

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

相关文章

  • 使用@NonNull注解遇到的小问题及解决

    使用@NonNull注解遇到的小问题及解决

    这篇文章主要介绍了使用@NonNull注解遇到的小问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • spring boot拦截器实现IP黑名单实例代码

    spring boot拦截器实现IP黑名单实例代码

    本篇文章主要介绍了spring boot拦截器实现IP黑名单实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java中断异常的正确处理方法

    Java中断异常的正确处理方法

    这篇文章主要给大家介绍了关于Java中断异常的正确处理方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Spring的@Value如何从Nacos配置中心获取值并自动刷新

    Spring的@Value如何从Nacos配置中心获取值并自动刷新

    这篇文章主要介绍了Spring的@Value如何从Nacos配置中心获取值并自动刷新,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Netty启动流程服务端channel初始化源码分析

    Netty启动流程服务端channel初始化源码分析

    这篇文章主要为大家介绍了Netty启动流程服务端channel初始化源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • java awt实现计算器功能

    java awt实现计算器功能

    这篇文章主要为大家详细介绍了java awt实现计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • JDBC程序更新数据库中记录的方法

    JDBC程序更新数据库中记录的方法

    这篇文章主要介绍了JDBC程序更新数据库中记录的方法,涉及Java基于JDBC操作数据库的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Java pdf和jpg互转案例

    Java pdf和jpg互转案例

    这篇文章主要介绍了Java pdf和jpg互转案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • mybatis打印SQL,并显示参数的实例

    mybatis打印SQL,并显示参数的实例

    这篇文章主要介绍了mybatis打印SQL,并显示参数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java实现仿淘宝滑动验证码研究代码详解

    Java实现仿淘宝滑动验证码研究代码详解

    这篇文章主要介绍了Java实现仿淘宝滑动验证码研究代码详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06

最新评论