类型转换器
1. 简介
org.apache.ibatis.type.BaseTypeHandler
如上图,是mybatis自带的部分类型转换器,基本全部覆盖了java常用类型。
2. 自定义类型转换器
参考官网示例即可
3 流程分析
3.1 注册类型转换器
注册关键源码如下,类型转换器被存储在Map中
private void register(Type javaType, JdbcType jdbcType, TypeHandler<?> handler) {
if (javaType != null) {
Map<JdbcType, TypeHandler<?>> map = typeHandlerMap.get(javaType);
if (map == null || map == NULL_TYPE_HANDLER_MAP) {
map = new HashMap<>();
}
map.put(jdbcType, handler);
typeHandlerMap.put(javaType, map);
}
allTypeHandlersMap.put(handler.getClass(), handler);
}
Mybatis大致注册TypeHandler流程如下:
根据流程我们得出:
- Mybatis类型转换器存储在Map中
- 同类型的转换器,后注册的会覆盖之前注册的
- 包扫描方式注册的类型转换器无法保证注册顺序,即如果声明了多个相同类型的转换器,无法确定Mybatis最后注册哪一个
- 使用注解方式声明的类型转换器,由于是根据注册顺序来注册的,所以可以使用@Order注解来指定最后注册的那一个转换器
3.2 使用类型转换器
由上图流程可知,如果不确定Mybatis最后一个注册并生效的类型转换器是哪一个,可以通过mapper文件typeHandler属性,手动指定要使用的转换器。
结论:
- Mybatis首先注册自带的类型转换器
- 然后扫描配置的 mybatis.type-handlers-package 属性下的转换器并注册(无序)
- 然后扫描并注册BeanFactory中的类型转换器(类加载顺序,可通过@Order来指定顺序)
- 可以在mapper文件中,通过typeHandler属性来指定要使用的typeHandler