Mybatis源码解析(一)(2015年06月11日)
一、简介
先看看Mybatis的源码结构图,Mybatis3.2.7版本包含的包共计19个,其他版本可能会少。
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的,SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得,而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。获取SqlSessionFactory 之后便可以获取SqlSession,SqlSession中包含了一系列操作数据库的增删查改的方法。
所以Mybatis的三个重要核心就是:SqlSessionFactoryBuilder 、SqlSessionFactory 、SqlSession
二、源码解析
1、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 、SqlSessionFactory 、SqlSession这三个类都位于session包下,这是SqlSessionFactoryBuilder类结构图
类中的9个build方法都是为了创建并返回SqlSessionFactory对象,根据参数类型,实际上可以分为三类方法
1.以Configuration对象为参数的创建
2.以InputStream对象为参数的创建
3.以Reader对象为参数的创建
但实际上最重要的是以Configuration对象的build方法,因为以InputStream、Reader对象为参数的build方法最后都是通过读取xml配置文件,创建Configuration对象,并调用以Configuration对象为参数的build方法,最终返回DefaultSqlSessionFactory对象,以下是源码
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder e = new XMLConfigBuilder(reader, environment, properties);
var5 = this.build((Configuration)e.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException var13) {
;
}
}
return var5;
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder e = new XMLConfigBuilder(inputStream, environment, properties);
var5 = this.build((Configuration)e.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException var13) {
;
}
}
return var5;
}
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
2、SqlSessionFactory
SqlSessionFactory是一个接口,其实真实干活的事它的实现类DefaultSqlSessionFactory,SqlSessionFactory顾名思义它是一个SqlSession的工厂类,其作用主要也是向外提供SqlSession,还有一个作用就是可以获取Configuration对象
public interface SqlSessionFactory {
SqlSession openSession();
SqlSession openSession(boolean var1);
SqlSession openSession(Connection var1);
SqlSession openSession(TransactionIsolationLevel var1);
SqlSession openSession(ExecutorType var1);
SqlSession openSession(ExecutorType var1, boolean var2);
SqlSession openSession(ExecutorType var1, TransactionIsolationLevel var2);
SqlSession openSession(ExecutorType var1, Connection var2);
Configuration getConfiguration();
}
提供8中获取SqlSession的方法,涉及的参数主要有:自定义连接、事物隔离级别、ExecutorType(Statement类型【普通、预处理、批处理】)
这里需要注意的是openSession方法不是默认自动提交事物的。
3、SqlSession
SqlSession同样是一个接口,实际干活的也是它的实现类DefaultSqlSession,这是它的类结构图
从图中我们可以看出,SqlSession的作用主要是提供数据库的一些基本操作。