type包主要功能
- 完成java数据类型与jdbc数据类型的互相转化。
type包主要结构
type包设计模式
- 模版方法设计模式:我们可以自定义typeHandler,只需要继承BaseTypeHandler重写几个基本的方法即可。
- TypeReference类源码很经典,各个typeHandler都继承它,TypeReference只有一个成员变量rawType,此字段保存这个TypeHandler对相应的原生java类型
- Mybatis在启动初始化过程中,会将自带的java类型与用户自定义的typeHandlers标签内的所有TypeHandler,注册至Configuration内
- TypeReference就是用来通过使用泛型参数与反射原理,从某个TypeHandler中获取对应的原生java类型保存在rawType字段中
- 例如:https://mybatis.org/mybatis-3/zh/configuration.html#typeHandlers 中的自定义typeHandler的例子
public abstract class TypeReference<T> {
private final Type rawType;
protected TypeReference() {
rawType = getSuperclassTypeParameter(getClass());
}
Type getSuperclassTypeParameter(Class<?> clazz) {
Type genericSuperclass = clazz.getGenericSuperclass();
if (genericSuperclass instanceof Class) {
if (TypeReference.class != genericSuperclass) {
return getSuperclassTypeParameter(clazz.getSuperclass());
}
throw new TypeException("'" + getClass() + "' extends TypeReference but misses the type parameter. "
+ "Remove the extension or add a type parameter to it.");
}
Type rawType = ((ParameterizedType) genericSuperclass).getActualTypeArguments()[0];
if (rawType instanceof ParameterizedType) {
rawType = ((ParameterizedType) rawType).getRawType();
}
return rawType;
}
public final Type getRawType() {
return rawType;
}
@Override
public String toString() {
return rawType.toString();
}
}