mybatis不指定typehandler,使用哪个

 我来答
匿名用户
2016-08-03
展开全部
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.1

如果你遇到了这个问题,那么这篇博客正好适合你。如果你还没遇到,也可以避免遇到这个问题。
先说错误的原因,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;
}1234567891011121314151617

一般情况下我们如果在Mapper.xml中使用的resultType,或者使用的resultMap但是resultMap的配置中没有指定特殊类型字段的jdbcType,就会出现上面的错误。
从上面源码很容易能看出来,当jdbcType是null的时候:
handler = jdbcHandlerMap.get(jdbcType);
if (handler == null) {
handler = jdbcHandlerMap.get(null);
}1234

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;
}123456

该注解包含一个属性includeNullJdbcType,将该属性设置为true即可。
2. xml配置
首先重点说明一下:如果使用了上面的注解配置,那么在xml中的jdbcType配置不会起作用,会完全使用注解中的配置。
xml配置方法很简单,那就是不要配置jdbcType属性,例如:
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>1234

这种情况下就配置了一个只有null的jdbcType。
实际上大多数人可能都是这么配置的,因此都没有遇到过这个异常。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式