MyBatis_运行原理

注:本笔记是根据尚硅谷的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);

猜你喜欢

转载自blog.csdn.net/jinhaijing/article/details/84314576