Mybatis 示例之 TypeHandler
来源:互联网 发布:js连接mysql数据库 编辑:程序博客网 时间:2024/05/23 21:26
关于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>
这种情况下就配置了一个只有null
的jdbcType。
实际上大多数人可能都是这么配置的,因此都没有遇到过这个异常。
- Mybatis 示例之 TypeHandler
- MyBatis之typeHandler
- MyBatis之TypeHandler解析
- Mybatis源码学习之TypeHandler
- mybatis精通之路之TypeHandler初探
- mybatis typeHandler
- Mybatis TypeHandler
- mybatis typeHandler
- MyBatis TypeHandler
- Mybatis实战之TypeHandler高级进阶
- Mybatis实战之自定义TypeHandler处理枚举
- Mybatis实战之TypeHandler高级进阶
- Mybatis实战之自定义TypeHandler处理枚举
- Mybatis实战之TypeHandler高级进阶
- Mybatis实战之自定义TypeHandler处理枚举
- Mybatis实战之TypeHandler高级进阶
- Mybatis实战之自定义TypeHandler处理枚举
- Mybatis实战之TypeHandler高级进阶
- 十个免费的Web压力测试工具
- MuPdf编译so文件
- linux内核kallsyms机制分析
- hdu 2243 考研路茫茫——单词情结 (ac自动机+矩阵优化)
- Bitmap 位图索引原理
- Mybatis 示例之 TypeHandler
- java基础之 JDBC、DBUtils
- 监控摄像头主动应用一例
- 二、Oracle12c中的CDB与PDB
- ListView实现分页功能
- Shiro源码学习之ShiroFilter
- MVC三层模(struts+spring+hibernate(SSH)总结
- 实现图像处理算法中采用策略“Strategy”模式+Qt中相对路径
- 九度OJ题目1031:xxx定律