Mybatis的体系结构与核心工作原理
从宏观角度学习Mybatis的架构、工作原理、主要模块,从微观角度学习Mybatis的工作原理与设计思想。
一、体系结构
1.三层划分介绍
Mybatis的整体架构从宏观上可分为三层,分别是基础支持层、核心处理层和接口层。如下图:
Mybatis主要工作流程图:
在Mybatis主要工作流程里,不同的功能由很多不同的类协作完成,它们分布在Mybatis的不同的Package里面。
1.1 接口层
接口层的核心是SqlSession,它是上层应用和Mybatis打交道的桥梁,SqlSession上定义了非常多的对数据库的操作方法。接口层在接收到请求时,会调用核心处理层的各个模块来完成具体对数据库的操作。
1.2 核心处理层
核心处理层完成对数据库的所有操作。
核心处理层主要做了这几件事:
1.把接口中传入的参数解析并且映射成JDBC类型;
2.解析xml文件中的SQL语句,包括插入参数,和动态SQL生成;
3.执行SQL语句;
4.处理结果集并映射成Java对象;
插件也属于核心层,这是因为它的工作方式是拦截核心处理层的四大对象。
1.3 基础支持层
基础支持层主要是为了让一些通用的功能实现复用,用来支持核心处理层工作。比如数据源、缓存、日志、xml解析、反射、事务等。
二、核心流程
// 1.获取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 2.加载解析配置文件并获取SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// 3.根据SqlSessionFactory对象获取SqlSession对象
SqlSession sqlSession = factory.openSession();
// 4.通过SqlSession中提供的API方法来操作数据库
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.selectUserList();
for (User user : list) {
System.out.println(user);
}
// 5.关闭会话
sqlSession.close();
上面我们用5个步骤实现了一个Mybatis查询数据库的操作,下面按照这5个步骤来分析Mybatis的运行原理。
2.核心对象的生命周期
2.1 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder顾名思义它是用来构建SqlSessionFactory的,SqlSessionFactory我们只需要一个,所以只要构建了SqlSessionFactory,它也就没有存在的意义了。所以它的生命周期只存在于方法的局部。
2.2 SqlSessionFactory
SqlSessionFactory是用来创建SqlSession的,每次应用程序访问数据库操作,都需要创建一个会话。因为我们一直有创建会话的需求,所以SqlSessionFactory应该存在于应用的整个生命周期中(作用域是应用作用域)。为了不造成浪费资源,SqlSession只需要一个实例对象来创建,所以我们要采用单例模式。
2.3 SqlSession
一个Sqlsession是一次会话,它的生命周期存在于一次请求会话中。因为它不是线程安全的,不能在线程间共享,所以我们在请求开始的时候创建一个SqlSession对象,在请求结束或者方法执行完毕的时候,要及时的关闭它。
2.4 Mapper
Mapper通过源码分析它实际上是一个代理对象,是从SqlSession中获取的。
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
它的作用是发送SQL来操作数据库的数据,它的作用域在一个SqlSession事务方法之内。