Mybatis 示例之 TypeHandler

71 篇文章 57 订阅
31 篇文章 580 订阅

关于TypeHandler的基础内容可以参考官方中文文档:

http://mybatis.github.io/mybatis-3/zh/configuration.html#typeHandlers

TypeHandler写起来很容易,但是有一个很重要的点需要注意。

你是否遇到过类似下面的错误:

Caused by: java.lang.RuntimeException: 调用方法异常:java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'xxx'.  It was either not specified and/or could not be found for the javaType / jdbcType combination specified.

如果你遇到了这个问题,那么这篇博客正好适合你。如果你还没遇到,也可以避免遇到这个问题。

先说错误的原因,MyBatis在查找类型的TypeHandler的时候,调用下面的方法:

private <T> TypeHandler<T> getTypeHandler(Type type, JdbcType jdbcType) {
  Map<JdbcType, TypeHandler<?>> jdbcHandlerMap = TYPE_HANDLER_MAP.get(type);
  TypeHandler<?> handler = null;
  if (jdbcHandlerMap != null) {
    handler = jdbcHandlerMap.get(jdbcType);
    if (handler == null) {
      handler = jdbcHandlerMap.get(null);
    }
  }
  if (handler == null && type != null 
                      && type instanceof Class 
                      && Enum.class.isAssignableFrom((Class<?>) type)) {
    handler = new EnumTypeHandler((Class<?>) type);
  }
  // type drives generics here
  return (TypeHandler<T>) handler;
}

一般情况下我们如果在Mapper.xml中使用的resultType,或者使用的resultMap但是resultMap的配置中没有指定特殊类型字段的jdbcType,就会出现上面的错误。

从上面源码很容易能看出来,当jdbcType是null的时候:

handler = jdbcHandlerMap.get(jdbcType);
if (handler == null) {
  handler = jdbcHandlerMap.get(null);
}

jdbcHandlerMap.get(jdbcType)jdbcHandlerMap.get(null)作用是一样的,结果都是null,因此就会报出上面提到的错误。

这个错误如何解决呢?

如果仅从上面错误的原因配置一个jdbcType也解决不了使用resultType时的问题。

从源码handler = jdbcHandlerMap.get(null);这里可以看到,默认情况下如果有jdbcType,但是handler=null,也会尝试取出一个key为null的handler。

也就是说一般情况下,我们自己配置的TypeHandler都需要有一个key=null的键值。

如何设置一个null的key呢?如果你认为是枚举类型JdbcType.NULL那就错了。

TypeHandler有两种设置null的方式:

1. @MappedJdbcTypes注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MappedJdbcTypes {
    public JdbcType[] value();
    boolean includeNullJdbcType() default false;
}

该注解包含一个属性includeNullJdbcType,将该属性设置为true即可。

2. xml配置

首先重点说明一下:如果使用了上面的注解配置,那么在xml中的jdbcType配置不会起作用,会完全使用注解中的配置。

xml配置方法很简单,那就是不要配置jdbcType属性,例如:

<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>

这种情况下就配置了一个只有nulljdbcType

实际上大多数人可能都是这么配置的,因此都没有遇到过这个异常。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

isea533

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值