MyBatis源码解析(九),mdash,mdash,Type类型模块之类型处理器注册器...

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 TypeHandler getTypeHandler(Class javaTypeClass) {

return getNullableTypeHandler(javaTypeClass);

}

```

getNullableTypeHandler方法的实现如下:

```java

@SuppressWarnings("unchecked")

private TypeHandler getNullableTypeHandler(Class javaTypeClass) {

if (javaTypeClass == null) {

return null;

}

// 查找注册表中的类型处理器

TypeHandler typeHandler = (TypeHandler) map.get(javaTypeClass);

if (typeHandler == null && Enum.class.isAssignableFrom(javaTypeClass)) {

// 如果javaTypeClass是枚举类型,则获取枚举类型的类型处理器(EnumTypeHandler)

typeHandler = new EnumTypeHandler<>(javaTypeClass);

}

return typeHandler;

}

```

这段代码的逻辑也比较简单:

- 首先,根据Java类型从注册表中查找对应的类型处理器。

- 如果找不到对应的类型处理器,并且Java类型是枚举类型,则返回一个EnumTypeHandler,该类型处理器专门用于处理枚举类型。

通过这个逻辑,我们可以保证在MyBatis中使用到的Java类型都能找到对应的类型处理器。

类型处理器注册器在MyBatis中起到了非常重要的作用,它通过注册和查找的机制,将所有的类型处理器进行统一管理,并确保在数据库操作过程中,Java类型与数据库类型的转换能够得到正确的处理。通过深入理解类型处理器注册器的实现原理,我们可以更好地理解MyBatis的类型处理器模块,为我们自定义类型处理器提供一些借鉴和参考。


点赞(12) 打赏
如果你喜欢我们的文章,欢迎您分享或收藏为众码农的文章! 我们网站的目标是帮助每一个对编程和网站建设以及各类acg,galgame,SLG游戏感兴趣的人,无论他们的水平和经验如何。我们相信,只要有热情和毅力,任何人都可以成为一个优秀的程序员。欢迎你加入我们,开始你的美妙旅程!www.weizhongchou.cn

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部