mybatis之builder包处理mybatis初始化
Posted 我爱看明朝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis之builder包处理mybatis初始化相关的知识,希望对你有一定的参考价值。
mybatis之builder包处理mybatis初始化
mybatis有两种xml的文件,一种是Mybatis-config.xml负责配置mybatis的各种配置以及指定映射文件;一种是xml映射文件负责sql。
其中配置文件有很多子节点,各自有各自的功能,xml也有多种子节点resultMap、sql、select、insert、update要解析这些复杂的配置为对象,一个简单的类肯定是不够的,
这个时候就需要各个不通职责的子类合作来解析配置和映射文件。mybatis通过建造者模式来解析配置文件和映射文件。
建造者模式: 是将一个复杂的对象的构建与它的标识分离。使得同样的构建过程可以创建不同的表示。建造者隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的>方式,动态的创建具有符合属性的对象。
调用关系
读取myabits-config.xml的配置,解析各个子节点,以及配置的映射文件,解析映射文件中的各个子节点。
SqlSessionFactoryBuilder.build() : 读取mybatis配置文件
XMLConfigBuilder.parse() : 解析配置文件
XMLMapperBuilder.parse() : 解析映射文件
XMLStatementBuilder.parseStatementNode() : 解析映射文件中select|insert|update|delete子节点
RawLanguageDriver.createSqlSource() : 开始解析节点中的sql语句
XMLLanguageDriver.createSqlSource() :
XMLScriptBuilder.parseScriptNode() : 负责解析sql中的动态语句
RawSqlSource.RawSqlSource() :构造方法
SqlSourceBuilder.parse() :
BaseBuilder
解析配置文件和映射文件的基础类,存储了configuration、配置类型别名、类型处理器、及通过string查询JDBC枚举类型,为子类提供公共服务。
public abstract class BaseBuilder {
// mybatis配置文件解析的对象
protected final Configuration configuration;
// 类型别名,减少代码中的冗余
protected final TypeAliasRegistry typeAliasRegistry;
// 类型处理器
protected final TypeHandlerRegistry typeHandlerRegistry;
public BaseBuilder(Configuration configuration) {
this.configuration = configuration;
this.typeAliasRegistry = this.configuration.getTypeAliasRegistry();
this.typeHandlerRegistry = this.configuration.getTypeHandlerRegistry();
}
public Configuration getConfiguration() {
return configuration;
}
// 类型转换 子类XMLConfigBuilder转换从mybatis-config.xml读取到的配置值
protected Pattern parseExpression(String regex, String defaultValue) {
return Pattern.compile(regex == null ? defaultValue : regex);
}
protected Boolean booleanValueOf(String value, Boolean defaultValue) {
return value == null ? defaultValue : Boolean.valueOf(value);
}
protected Integer integerValueOf(String value, Integer defaultValue) {
return value == null ? defaultValue : Integer.valueOf(value);
}
protected Set<String> stringSetValueOf(String value, String defaultValue) {
value = (value == null ? defaultValue : value);
return new HashSet<String>(Arrays.asList(value.split(",")));
}
// 根据字符串查询JdbcType枚举
protected JdbcType resolveJdbcType(String alias) {
if (alias == null) {
return null;
}
try {
return JdbcType.valueOf(alias);
} catch (IllegalArgumentException e) {
throw new BuilderException("Error resolving JdbcType. Cause: " + e, e);
}
}
// 根据类型别名查询对应的对象
protected Class<?> resolveAlias(String alias) {
return typeAliasRegistry.resolveAlias(alias);
}
// 查询类型处理器
protected TypeHandler<?> resolveTypeHandler(Class<?> javaType, Class<? extends TypeHandler<?>> typeHandlerType) {
if (typeHandlerType == null) {
return null;
}
// javaType ignored for injected handlers see issue #746 for full detail
TypeHandler<?> handler = typeHandlerRegistry.getMappingTypeHandler(typeHandlerType);
if (handler == null) {
// not in registry, create a new one
handler = typeHandlerRegistry.getInstance(javaType, typeHandlerType);
}
return handler;
}
}
以上是关于mybatis之builder包处理mybatis初始化的主要内容,如果未能解决你的问题,请参考以下文章