一、Mybatis运行流程概述
为了熟悉Mybatis的运行流程,我们先看一段代码
java复制代码public class MybatisDemo {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException {
//--------------------第一步:加载配置---------------------------
// 1.读取mybatis配置文件创SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 1.读取mybatis配置文件创SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
inputStream.close();
}
@Test
// 快速入门
public void quickStart() throws IOException {
//--------------------第二部,创建代理对象---------------------------
// 2.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.获取对应mapper
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
//--------------------第三步:获取数据---------------------------
// 4.执行查询语句并返回单条数据
TUser user = mapper.selectByPrimaryKey(2);
System.out.println(user);
System.out.println("----------------------------------");
// 5.执行查询语句并返回多条数据
// List<TUser> users = mapper.selectAll();
// for (TUser tUser : users) {
// System.out.println(tUser);
// }
}
}
以上是我们一个使用mybatis访问数据的demo,通过对快速入门代码的分析,可以把 MyBatis 的运行流程分为三大阶段:
- 初始化阶段:读取 XML 配置文件和注解中的配置信息,创建配置对象,并完成各个模块的初始化的工作;
- 代理封装阶段:封装 iBatis 的编程模型,使用 mapper 接口开发的初始化工作;
- 数据访问阶段:通过 SqlSession 完成 SQL 的解析,参数的映射、SQL 的执行、结果的解析过程;
今天我们就介绍以下第一个阶段中,Mybatis是如何读取配置的
二、配置加载的核心类
2.1 建造器三个核心类
在 MyBatis 中负责加载配置文件的核心类有三个,类图如下:
- BaseBuilder:所有解析器的父类,包含配置文件实例,为解析文件提供的一些通用的方法;
- XMLConfigBuilder: 主要负责解析 mybatis-config.xml;
- XMLMapperBuilder: 主要负责解析映射配置 Mapper.xml 文件;
- XMLStatementBuilder: 主要负责解析映射配置文件中的 SQL 节点;
XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder 这三个类在配置文件加载过程中非常重要,具体分工如下图所示:
这三个类使用了建造者模式对 configuration 对象进行初始化,但是没有使用建造者模式 的“肉体”(流式编程风格),只用了灵魂(屏蔽复杂对象的创建过程),把建造者模式演绎 成了工厂模式;后面还会对这三个类源码进行分析;
居然这三个对象使用的是建造者模式,那么我们稍后介绍下什么是建造者模式
三、建造者模式
3.1 什么是建造者模式
建造者模式(BuilderPattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
建造者模式类图如下: