一、什么是Mybatis
引用Mybatis文档中的介绍:Mybatis是一款优秀的持久层框架,他支持自定义Sql、存储过程以及高级映射。Mybatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。Mybatis可以通过简单的XML或注解来配置和映射原始类型、接口和Java的POJO为数据库中的记录。
而对于我自己想学习Mybatis的源码的原因,一是想了解Mybatis的源码,二是想学习下Mybatis中的设计模式,比如责任链、代理、装饰者模式等。
二、传统的JDBC操作
1、加载数据库驱动。
2、通过DriverManager注册驱动。
3、通过DriverManager创建数据库连接Connection。
4、通过Connection创建Statement/PreparedStatement。
5、通过Statement进行数据库操作。
6、处理结果集。
7、关闭资源。
由于传统的JDBC中,如果每一个线程对数据库进行操作时,都需要进行上述的七步操作,从而导致开发中不停的造轮子,因此我们可以引入Mybatis框架,交给Mybatis来帮我们做这些事,我们只需要关心对应的配置信息和sql的编写即可。
三、SqlSessionFactoryBuilder
引用Mybatis官方文档,构建SqlSessionFactory时会使用到SqlSessionFactoryBuilder。
因此SqlSessionFactoryBuilder的作用为构建SqlSessionFactory。
· SqlSessionFactoryBuilder源码
public class SqlSessionFactoryBuilder {
//...public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); return build(parser.parse()); } catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e); } finally {
ErrorContext.instance().reset(); try {
inputStream.close(); } catch (IOException e) {
}
}
}public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config); }
}
build中的源码过程即对parser进行解析,解析完后,生成SqlSessionFactroy对象。
观察DefaultSqlSessionFactory(config)构造函数,可以发现,SqlSessionFactory类中维护了一个configuration对象,用于存储environment(数据库相关环境信息)、mapperRegistry(mapper或dao层接口映射器信息)、typeHandlerRegistr(类型处理器信息)等。
public DefaultSqlSessionFactory(Configuration configuration) {
this.configuration = configuration;}
· 解析XML文件
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
//解析XML文件
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
//...
}
public XPathParser(InputStream inputStream, boolean validation, Properties variables, EntityResolver entityResolver) {
commonConstructor(validation, variables, entityResolver);
//调用jdk方法,生成document树
this.document = createDocument(new InputSource(inputStream));}
引用Mybatis官方文档配置的xml信息为:
========>
转换为document树后的结点信息为: