各位大佬,小弟这是自我学习总结,如有错误,请指教。
Mybatis 执行流程
1.配置Mybatis核心配置文件mybatis-config.xml,也可以是别的命名,只不过官方文档建议使用mybatis-config.xml,配置内容我就略过了,因为我想总结的是执行流程,而不是使用配置流程。
2.在java代码中最终到获取SqlSession,但是在官方文档上SqlSession是由SqlSessionFactory创建获取的,SqlSessionFactory是由SqlSessionFactoryBuilder创建获取的,接下来要具体的说一下SqlSessionFactoryBuilder具体干了什么,SqlSessionFactory又干了什么,最终获取到SqlSession
private static SqlSessionFactory sqlSessionFactory; static { try { //1 .获取SQLSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //SqlSessionFactoryBuilder 解析配置文件流 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } }
3.从上面代码一步一步的取认识它的底层,首先是获取的mybatis-config.xml的路径
4.使用Resources获取加载mybatis-config.xml全局配置文件流,InputStream,输出流嘛~~
5.new SqlSessionFactoryBuilder,实例化SqlSessionFactoryBuilder构造器
6.new SqlSessionFactoryBuilder().build(InputStream);看看build做了什么
build使用XMLConfigBuilder来解析mybatis-config.xml,从方法parseConfiguration可以看到有11个和mybatis-config.xml的属性一样,从而得知他就是解析mybatis-config.xml还有就是Debug可以发现mybatis-config.xml最后解析成了Configuration这个类
private XMLConfigBuilder(XPathParser parser, String environment, Properties props) { super(new Configuration()); this.localReflectorFactory = new DefaultReflectorFactory(); ErrorContext.instance().resource("SQL Mapper Configuration"); this.configuration.setVariables(props); this.parsed = false; this.environment = environment; this.parser = parser; } public Configuration parse() { if (this.parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } else { this.parsed = true; this.parseConfiguration(this.parser.evalNode("/configuration")); return this.configuration; } } private void parseConfiguration(XNode root) { try { this.propertiesElement(root.evalNode("properties")); Properties settings = this.settingsAsProperties(root.evalNode("settings")); this.loadCustomVfs(settings); this.loadCustomLogImpl(settings); this.typeAliasesElement(root.evalNode("typeAliases")); this.pluginElement(root.evalNode("plugins")); this.objectFactoryElement(root.evalNode("objectFactory")); this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); this.reflectorFactoryElement(root.evalNode("reflectorFactory")); this.settingsElement(settings); this.environmentsElement(root.evalNode("environments")); this.databaseIdProviderElement(root.evalNode("databaseIdProvider")); this.typeHandlerElement(root.evalNode("typeHandlers")); this.mapperElement(root.evalNode("mappers")); } catch (Exception var3) { throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + var3, var3); } }
解析成了Configuration,他把所有mybatis-config.xml配置的一些属性都解析成了Configuration这个实体对象

7.SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(InputStream);实例化sqlSessionFactory,但是实例化后的sqlSessionFactory 肯定保包含Configuration
8.在创建 缓存 transactional事物管理器,目前学到的知识这我还是比较难理解的~日后在补充吧

9.在创建executor核心执行器,先有的缓存 事物
10.创建SqlSession
11.实现增删改查
12.if(执行error){回滚事物},else {查看是否执行成功}
13.if(执行不成){回滚事物},else { 提交事物}
14.关闭 sqlSession.close();
下面我转发一个流程图,上面我描述的不是很好,有的知识点还是不能够深入的理解,日后在在这片文章上在做补充吧

浙公网安备 33010602011771号