注:本笔记是根据尚硅谷的MyBatis视频记录的
一、Mybatis架构图
二、Mybatis的工作原理
三、Mybatis的运行原理源码分析
Mybatis执行数据库查询时,我们需要编写的代码:
一共分为四步:
- 获取sqlSessionFactory对象
- 获取sqlSession对象
- 获取接口的实现类mapper代理对象
- 接口的实现类对象执行数据库方法进行增删改查操作
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);
//4、接口的实现类对象执行数据库方法进行增删改查操作
Employee employee = mapper.getEmpById(1);
System.out.println(mapper);
System.out.println(employee);
} finally {
openSession.close();
}
}
那运行原理就按这四步依次debug进行分析......
1、获取sqlSessionFactory对象
解析文件的每一个信息保存在Configuration中,返回包含Configuration的DefaultSqlSession;
注意:【MappedStatement】:代表一个增删改查的详细信息
其中:
Configuration对象保存了所有配置文件的详细信息:
mapperdStatements对象:
knownMappers对象:
2、获取sqlSession对象
返回一个DefaultSQlSession对象,包含Executor和Configuration;
这一步会创建Executor对象;
3、获取接口的实现类mapper代理对象(MapperProxy)
getMapper,使用MapperProxyFactory创建一个MapperProxy的代理对象
代理对象里面包含了,DefaultSqlSession(Executor)
4、接口的实现类对象执行数据库方法进行增删改查操作
boundSql对象:
缓存中保存的key:方法id+sql+参数xxx:
四、查询流程总结
(1)、根据配置文件(全局,sql映射)初始化出Configuration对象
(2)、创建一个DefaultSqlSession对象,
他里面包含Configuration以及
Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor)
(3)、DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy;
(4)、MapperProxy里面有(DefaultSqlSession);
(5)、执行增删改查方法:
1)、调用DefaultSqlSession的增删改查(Executor);
2)、会创建一个StatementHandler对象。
(同时也会创建出ParameterHandler和ResultSetHandler)
3)、调用StatementHandler预编译参数以及设置参数值;
使用ParameterHandler来给sql设置参数
4)、调用StatementHandler的增删改查方法;
5)、ResultSetHandler封装结果
注意:
四大对象每个创建的时候都有一个interceptorChain.pluginAll(parameterHandler);