首先先给出一张执行流程图,然后按着这张图我们来解释下Mybatis到底帮我们做了什么。
首先我们要使用mybatis要先写个工具类,然后在里面写上resource 中mybatis的具体名字:
String resource = "mybatis-config.xml";
InputStream inputStream =
Resources.getResourceAsStream(resource);
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
然后实例化我们的SqlSessionFactoryBuilder(),说白了就是new一个SqlSessionFactoryBuilder来调用里面的静态方法build以此来传进去我们的配置文件名字。
然后我们跟进源码,进入的是build方法,然后方法内部调用了内部的一个重写后的build继续跟进:
public SqlSessionFactory build(InputStream inputStream) {
return this.build((InputStream)inputStream, (String)null, (Properties)null);
}
方法内部自己创造了个工厂类SqlSessionFactory 然后在里面实现了实体类的XMLConfigBuilder ,使用构造方法导入我们的xml配置文件,将我们的xml配置文件实现类放到了另一个重写build中,我们继续跟进:
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
var5 = this.build(parser.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException var13) {
}
}
return var5;
}
最终返回了一个带xml配置文件的默认的DefaultSqlSessionFactory:至此前面几步实例化SqlSessionFactory实现类DefaultSqlSessionFactory就完成了:
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
后面部分我们用debug调试来说明,
这里我们进入了debug测试,回到刚刚的DefaultSqlSessionFactory部分:
在执行器executor前,我们先开启了事务
然后运行执行器,执行sqlsession里的sql语句成功就提交吗,失败了就回退