MyBatis源码解析(九) - Type类型模块之类型处理器注册器
在MyBatis中,类型处理器(Type Handler)负责将Java类型与数据库类型进行转换,并在二者之间进行数据的转换。为了统一管理和注册各种类型处理器,MyBatis设计了一个类型处理器注册器(Type Handler Registry)的组件。
类型处理器注册器的作用是将所有的类型处理器进行注册,并根据Java类型和数据库类型的对应关系,提供相应的类型处理器。当我们在MyBatis的配置文件中使用到某个Java类型时,MyBatis会通过类型处理器注册器来找到对应的类型处理器。
下面我们来详细解析一下MyBatis的类型处理器注册器的实现原理。
1. 注册类型处理器
类型处理器注册器在MyBatis的初始化过程中会调用register方法来注册所有的类型处理器,该方法的实现如下:
```java
public void register(TypeHandler> typeHandler) {
boolean mappedTypeFound = false;
MappedTypes mappedTypes = typeHandler.getClass().getAnnotation(MappedTypes.class);
if (mappedTypes != null) {
for (Class> javaTypeClass : mappedTypes.value()) {
register(javaTypeClass, typeHandler);
mappedTypeFound = true;
}
}
if (!mappedTypeFound && typeHandler instanceof TypeReference) {
TypeReference> typeReference = (TypeReference>) typeHandler;
register(typeReference.getRawType(), typeHandler);
}
}
```
这段代码的逻辑比较清晰:
- 首先,通过TypeHandler的getAnnotation方法来查找该类型处理器上是否有@MappedTypes注解。如果有,则取出注解上的所有Java类型,分别调用register方法进行注册。
- 如果没有@MappedTypes注解,但是类型处理器是TypeReference的子类(TypeReference是一个泛型抽象类),则取出实际的Java类型,调用register方法进行注册。
2. 注册Java类型与类型处理器的对应关系
注册Java类型与类型处理器的对应关系是通过Map来实现的,即使用一个容器来存储Java类型和对应的类型处理器。MyBatis使用一个HashMap来存储这些对应关系。注册过程的实现代码如下:
```java
public void register(Class> javaTypeClass, TypeHandler> typeHandler) {
if (javaTypeClass != null) {
map.put(javaTypeClass, typeHandler);
}
}
```
其中,javaTypeClass是Java类型,typeHandler是对应的类型处理器。将这两个参数存入map容器中,即完成了对Java类型和类型处理器的对应关系的注册。
3. 根据Java类型获取对应的类型处理器
通过Java类型在注册表中查找对应的类型处理器,使用的是get方法:
```java
public return getNullableTypeHandler(javaTypeClass); } ``` getNullableTypeHandler方法的实现如下: ```java @SuppressWarnings("unchecked") private if (javaTypeClass == null) { return null; } // 查找注册表中的类型处理器 TypeHandler if (typeHandler == null && Enum.class.isAssignableFrom(javaTypeClass)) { // 如果javaTypeClass是枚举类型,则获取枚举类型的类型处理器(EnumTypeHandler) typeHandler = new EnumTypeHandler<>(javaTypeClass); } return typeHandler; } ``` 这段代码的逻辑也比较简单: - 首先,根据Java类型从注册表中查找对应的类型处理器。 - 如果找不到对应的类型处理器,并且Java类型是枚举类型,则返回一个EnumTypeHandler,该类型处理器专门用于处理枚举类型。 通过这个逻辑,我们可以保证在MyBatis中使用到的Java类型都能找到对应的类型处理器。 类型处理器注册器在MyBatis中起到了非常重要的作用,它通过注册和查找的机制,将所有的类型处理器进行统一管理,并确保在数据库操作过程中,Java类型与数据库类型的转换能够得到正确的处理。通过深入理解类型处理器注册器的实现原理,我们可以更好地理解MyBatis的类型处理器模块,为我们自定义类型处理器提供一些借鉴和参考。
如果你喜欢我们的文章,欢迎您分享或收藏为众码农的文章! 我们网站的目标是帮助每一个对编程和网站建设以及各类acg,galgame,SLG游戏感兴趣的人,无论他们的水平和经验如何。我们相信,只要有热情和毅力,任何人都可以成为一个优秀的程序员。欢迎你加入我们,开始你的美妙旅程!www.weizhongchou.cn
发表评论 取消回复