Mybatis详细的执行流程!
ctrl+左键 可以进入类的内部
- 第一步:Resources类通过调用静态方法 getResourceAsStream(String resource) 先读取并加载 mybatis-config.xml 核心配置文件 并返回一个字节输入流( 包不要导错: import org.apache.ibatis.io.Resources;)
- 第二步:通过 SqlSessionFactoryBuilder类 的一个对象调用 build(InputStream inputStream)方法获得一个 SqlSessionFactory 的对象(本质是调用了 build(InputStream inputStream, String environment, Properties properties) 这个方法)
- build(InputStream inputStream)内部调用的重载方法
parser.parse(),这个parser 是 new XMLConfigBuilder(…)出来的一个对象
- 第三步:XMLConfigBuilder类 开始解析配置文件
- 首先调用XMLConfigBuilder中的parse()方法
- 然后又在 parse()方法 内部调用了 XPathParser类的evalNode(String expression)方法
- 方法调用太多,就不一个一个介绍了,总而言之就是通过方法调用方法,解析完了你的mybatis-config.xml核心配置文件
- 第四步:执行完XMLConfigBuilder类的parse()方法后,SqlSessionFactoryBuilder类 才开始调用 build(Configuration config) ,实例化SqlSessionFactory
- 第五步:实例化 SqlSessionFactory 后,通过 SqlSessionFactory 的实例对象调用 openSession()方法 ,获得SqlSession的实例化对象
这里得等 this.configuration.getDefaultExecutorType() 方法执行完才会执行 openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)这个方法
- 先执行 this.configuration.getDefaultExecutorType() 方法
- 再执行 openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) 这个方法
- 第六步:拿到SqlSession以后,就可以调用getMapper(Class var)获得实体类对应的mapper接口的对象,然后调用接口内的方法,实现CRUD等操作
大概用流程图表示一下实现过程:
自己写的获取SqlSession的工具类,代码如下:
public class mybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource="mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlsession(){
return sqlSessionFactory.openSession();
}
}