各位大佬,小弟这是自我学习总结,如有错误,请指教。

 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);
        }
    }
View Code

解析成了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();

下面我转发一个流程图,上面我描述的不是很好,有的知识点还是不能够深入的理解,日后在在这片文章上在做补充吧

 

posted on 2020-09-11 12:29  唐门·三少  阅读(214)  评论(0)    收藏  举报