MyBatis运行原理
在学习运行原理之前,我们先来梳理一下使用MyBatis的步骤,我们从最简单的开始,一步一步往下看
- 获取sqlSessionFactory对象
- 获取sqlSession对象
- 获取接口的实现类对象
- 执行CRUD操作
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test01() throws IOException {
// 1、获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
// 2、获取sqlSession对象
SqlSession openSession = sqlSessionFactory.openSession();
try {
// 3、获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpById(1);
System.out.println(mapper);
System.out.println(employee);
} finally {
openSession.close();
}
}
获取sqlSessionFactory对象
configuration封装了所有配置文件的详情信息,mybatis是将配置文件的信息解析并保存在Configuration对象中,返回包含了Configuration的DefaultSqlSession对象。
sqlSessionFactory是一个接口,而DefaultSqlSession实现了这个接口的方法
获取sqlsession对象
返回sqlsession的实现类defaultSqlSession对象,里面包含了configuration和executor,executor会在这一步被创建
获取接口的实现类对象
获取接口的实现类对象,通过测试、观察源码可以发现这是获取了一个代理对象
执行CRUD操作
总结
-
通过配置文件(全局配置文件、mapper映射文件),初始化configuration对象,并将所有信息存储在此对象中
-
创建一个DefaultSqlSession对象,其中包含configuration对象以及全局配置文件中设置类型对应的Executor对象
-
DefaultSqlSession.getMapper(type),拿到接口相对于的代理类对象MapperProxy
-
MapperProxy中包含DefaultSqlSession,理所当然也包含了configuration和Executor
-
执行CRUD操作
-
调用DefaultSqlSession对象的CRUD操作,其内部调用了Executor的CRUD操作
-
创建一个StatementHandler对象(同时也会创建ParameterHandler和ResultSetHandler)
-
调用StatementHandler,处理sql语句预编译、设置预编译的参数
其中使用ParameterHandler来设置参数
-
调用StatementHandler的CRUD操作
-
使用ResultSetHandler封装结果
-
注意:四大类中每一个类的创建都会执行一次包装语句,这个在插件的时候会学到
例如(Executor)
Executor executor = (Executor)this.interceptorChain.pluginAll(executor);