注:我们目前学习的是基于不使用spring的情况下mybatis的源码。
流程
首先,我们先看一下我们上次使用的例子:
Public static void main(String[] args) {
String resource = “config/mybatis-config.xml”;
InputStream inputStream;
SqlSession session = null;
try {
inputStream = Resources.getResourceAsStream(resource);
// 构建sqlSession工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取sqlSession
session = sqlSessionFactory.openSession();
// 方法1
String statement = “com.mapper.IStudentMapper.getAll”;
List student = session.selectList(statement);
System.out.println(student);
// 方法2
IStudentMapper sessionMapper = session.getMapper(IStudentMapper.class);
List list = sessionMapper.getAll();
System.out.println(list);
} catch (IOException e) {
e.printStackTrace();
} finally {
session.close();
}
}
上述代码基本上就是Mybatis的整个流程了,接下来,我们来结合源码来看下,Mybatis是如何初始化,如何获取SqlSession的。
通过mybatis的Resources来读取全局配置文件,然后以流的形式作为SqlSessionFactoryBuilder的build方法的参数传入;
SqlSessionFactoryBuilder根据参数创建XMLConfigBuilder对象,然后调用XMLConfigBuilder的parse方法生成Configuration对象;
然后SqlSessionFactoryBuilder根据Configuration对象作为参数,调用重载的另一个方法build,生成DefaultSqlSessionFactory对象。
最终,返回DefaultSqlSessionFactory对象。
我们来简单看下代码:
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
// 根据输入流等参数生成XMLConfigBuilder对象,而XMLConfigBuilder用来解析全局配置
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
// 通过parser.parse方法生成Configuration对象,然后再调用重载方法
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.
}
}
}
/**
- 最后调用该方法生成factory,所以这里我们也可以手动传入Configuration对象来构建SessionFactory
*/
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
上述过程中,涉及到以下几个对象:
XMLConfigBuilder 该对象的目的就是负责解析配置文件的数据,解析成Configuration对象;
Configutation,该对象是全局配置文件mybatis-config.xml所对应的Java对象;
SqlSessionFactoryBuilder,该对象很明显就是为了构建sessionFactory的构造器。
Conguration对象
这里可以注意下,XMLConfigBuilder在这里使用了设计模式中的建造者模式,基本建造者基类是BaseBuilder,XMLConfigBuilder是BaseBuilder类的实现之一,就是具体建造者的角色,所负责的就是解析mybatis-config.xml这个配置文件。
public class XMLConfigBuilder extends BaseBuilder {