启
此案例基于mybatis原生demo分析
测试代码
Properties properties = new Properties();
// 使用ClassLoader加载properties配置文件生成对应的输入流
InputStream in = MybatisFirst.class.getClassLoader().getResourceAsStream("db.properties");
// 使用properties对象加载输入流
properties.load(in);
// 配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,properties);
SqlSessionFactory builder,此处设计模式是Builder模式。最终实现了XMLConfigBuilder
public SqlSessionFactory build(InputStream inputStream, Properties properties) {
return build(inputStream, null, properties);
}
xml最终调用构建方法
// xml最终都会调用这个方法构建
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
// 读取Xml
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
// 解析xml 并构建SqlSessionFactory
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
其中 XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);其实就是加载xml文件而已,parser.parse()才是解析xml文件。不过值得注意的是 BaseBuilder的构造方法
//Configuration 是 MyBatis 初始化过程的核心对象, MyBatis 中几乎全部的配置信息会保存到
//Configuration 对象中 。 Configuration 对象是在 MyBatis 初始化过程中创建且是全局唯一的,
protected final Configuration configuration;
// 类型别名注册器
protected final TypeAliasRegistry typeAliasRegistry;
protected final TypeHandlerRegistry typeHandlerRegistry;
// super(new Configuration()); //这里面是一个基础信息
public BaseBuilder(Configuration configuration) {
this.configuration = configuration;
this.typeAliasRegistry = this.configuration.getTypeAliasRegistry();
this.typeHandlerRegistry = this.configuration.getTypeHandlerRegistry();
}
别名
Mybatis支持别名,这个很多都知道的,所谓别名就是在指定类型是不用写全类路径,只需要这样
<typeAlias type="cn.itcast.mybatis.po.User" alias="user"/>
那么,我要在需要使用User的地方可以直接使用对应的别名usr来代替。
Mybatis同样为我们提供了默认的别名,
org.apache.ibatis.type.TypeAliasRegistry,这里面定义默认的别名,org.apache.ibatis.type.TypeHandlerRegistry则定义了别名对应的处理器。
XPathParser
XPathParser是Mybatis处理XML的工具类,具体类容就不多赘述。