赞
踩
上一章节我们一起分析了Mybatis的Plugin模块的源码。掌握了如何配置拦截器注解,如何自定义拦截器以及拦截器的执行过程。
在使用Mybatis的过程中,基本上我们都要在xml中编写相应的sql语句以及对应的java属性与字段的转换。那么对于数据库与java之间的转换,Mybatis是怎么做的呢?
接下来本章节我们对MyBatis Type模块类型转换的源码进行分析。
按惯例,咱们先了解下Type模块的总体架构设计。
Type模块所在包路径为org.apache.ibatis.type
,其对应的类架构设计图如下:
以上为Type模块的架构逻辑,当然针对不同的类型转换实现,架构图中只展示了IntegerTypeHandler、UnknownTypeHandler两个典型实现。
基于架构图,接下来逐个分析其实现源码。
JdbcType就是一个枚举类。该类定义了常用的一些数据类型,比如Integer,Double,Date,Date等,基本上满足了我们开发中常用的数据类型。
package org.apache.ibatis.type; import java.sql.Types; import java.util.HashMap; import java.util.Map; public enum JdbcType { INTEGER(Types.INTEGER), BIGINT(Types.BIGINT), FLOAT(Types.FLOAT), REAL(Types.REAL), DOUBLE(Types.DOUBLE), NUMERIC(Types.NUMERIC), DECIMAL(Types.DECIMAL), CHAR(Types.CHAR), VARCHAR(Types.VARCHAR), DATE(Types.DATE), BOOLEAN(Types.BOOLEAN) …… ; // JDBC 4.2 JDK8 public final int TYPE_CODE; private static Map<Integer,JdbcType> codeLookup = new HashMap<>(); static { for (JdbcType type : JdbcType.values()) { codeLookup.put(type.TYPE_CODE, type); } } JdbcType(int code) { this.TYPE_CODE = code; } public static JdbcType forCode(int code) { return codeLookup.get(code); } }
该注解接口作用于类型转换的实现类,用于标注要映射的java类型。
public @interface MappedTypes {
/**
* 返回要映射处理的java类型集合
*/
Class<?>[] value();
}
该注解接口作用于类型转换的实现类,用于标注要映射的数据库类型。
public @interface MappedJdbcTypes {
/**
* 返回要映射处理的jdbc类型集合
*/
JdbcType[] value();
/**
* 返回是否映射空值 默认false
*/
boolean includeNullJdbcType() default false;
}
关于MappedTypes、MappedJdbcTypes的使用,可参考源码测试中的StringTrimmingTypeHandler类:
@MappedTypes(String.class)
@MappedJdbcTypes(value={
JdbcType.CHAR,JdbcType.VARCHAR}, includeNullJdbcType=true)
public class StringTrimmingTypeHandler implements TypeHandler<String> {
//方法实现ain略
}
TypeReference的核心功能是获取类型转换实现类的父类泛型参数类型,听起来貌似有点绕
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。