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

作者:isea533 时间:2023-08-24 03:49:59 

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可以提!

来源:https://blog.csdn.net/isea533/article/details/58307149

标签:mybatis,jdbctypeinterceptor,jdbctype
0
投稿

猜你喜欢

  • SpringBoot整合Xxl-Job的完整步骤记录

    2021-08-08 20:47:16
  • Java如何重写object类的equals方法详解

    2023-09-01 15:54:57
  • SpringBoot利用限速器RateLimiter实现单机限流的示例代码

    2023-04-05 19:57:50
  • springboot @Async 注解如何实现方法异步

    2023-11-18 18:16:03
  • C++详细讲解继承与虚继承实现

    2022-10-25 18:33:49
  • MyBatis查询数据返回null的解决

    2021-11-17 20:46:48
  • 常见Android选项菜单样式集合

    2021-10-12 04:42:39
  • Android编程学习之抽象类AbsListView用法实例分析

    2023-03-18 12:19:49
  • Springboot整合Netty实现RPC服务器的示例代码

    2023-07-14 11:35:35
  • Java数字格式类(NumberFormat类和DecimalFormat类)用法详解

    2022-11-14 14:54:02
  • Java事件机制要素及实例详解

    2022-11-27 07:10:53
  • checkpoint 机制具体实现示例详解

    2023-03-31 21:42:01
  • 全面解读C#编程中的析构函数用法

    2021-05-24 00:27:33
  • Maven的使用之继承与聚合

    2023-08-14 21:47:14
  • Spring Boot集成Shiro实现动态加载权限的完整步骤

    2023-02-18 17:43:10
  • Java注释代码执行方法解析

    2023-09-28 00:16:01
  • java 画pdf用itext调整表格宽度、自定义各个列宽的方法

    2021-07-12 04:16:10
  • 详解Android中AsyncTask的使用方法

    2023-10-08 04:24:51
  • Java关键字finally_动力节点Java学院整理

    2022-09-25 11:15:30
  • Java面试题冲刺第二十三天--分布式

    2023-09-24 07:30:43
  • asp之家 软件编程 m.aspxhome.com