本篇文章我们首先解析SqlSessionFactory的创建过程。1、实例代码 在实例代码中,我们在测试类中写了一个init()方法,里面包括了SqlSessionFactory的构建,分为两步。 第一步:读取配置文件mybatisconfig。xml输入流 第二步:根据输入流构建SqlSessionFpublicvoidinit(){定义mybatis全局配置文件Stringresourcemybatisconfig。加载mybatis全局配置文件InputStreaminputStry{inputStreamResources。getResourceAsStream(resource);}catch(IOExceptione){e。printStackTrace();}构建sqlSession的工厂sessionFactorynewSqlSessionFactoryBuilder()。build(inputStream);} 没什么难的,去掉trycatch,也就两行代码。InputStreaminputStreamResources。getResourceAsStream(mybatisconfig。xml);SqlSessionFactorysessionFactorynewSqlSessionFactoryBuilder()。build(inputStream); 是的,那只是你以为的两行代码,其实。。。。。。 话不多说,指北君就来给大家揭秘这冰山下面的东西。2、代码剖析 根据上面的时序图,我们分析根据源码分析每个步骤。 、获取配置文件输入流InputStreaminputStreamResources。getResourceAsStream(mybatis。config。xml); 这里没什么好说的,就是获取配置文件的输入流。 、build(in) 这里的in就是上一步获取的输入流inputStream。publicSqlSessionFactorybuild(InputStreaminputStream){returnbuild(inputStream,null,null);} 在进入到build方法:publicSqlSessionFactorybuild(InputStreaminputStream,Stringenvironment,Propertiesproperties){try{XMLConfigBuilderparsernewXMLConfigBuilder(inputStream,environment,properties);returnbuild(parser。parse());}catch(Exceptione){throwExceptionFactory。wrapException(ErrorbuildingSqlSession。,e);}finally{ErrorContext。instance()。reset();try{inputStream。close();}catch(IOExceptione){Intentionallyignore。Preferpreviouserror。}}} 、XMLConfigBuilder(in) 这一段代码是为了解析我们的配置文件,配置文件是XML形式,我在之前的博客介绍过解析XML的几种方式。 一种是基于树的结构来解析的称为DOM;另一种是基于事件流的形式称为SAX和(StAX) 两者各有优缺点,我这里不做详细说明,想了解的可以看我之前的文章。 而Mybatis使用的是DOM形式,并结合XPath来解析配置文件。 、parse()publicConfigurationparse(){if(this。parsed){thrownewBuilderException(EachXMLConfigBuildercanonlybeusedonce。);}else{this。this。parseConfiguration(this。parser。evalNode(configuration));returnthis。}} 从configuration标签处开始解析。然后我们进入到this。parseConfiguration()方法中:privatevoidparseConfiguration(XNoderoot){try{this。propertiesElement(root。evalNode(properties));Propertiessettingsthis。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(Exceptionvar3){thrownewBuilderException(ErrorparsingSQLMapperConfiguration。Cause:var3,var3);}} 看到这是不是很熟悉了,这不就是mybatisconfig。xml配置文件里面的各个标签名嘛,是的,这就是解析该文件,然后全部放在configuration对象中。需要注意的是,这里的configuration对象不仅包括mybatisconfig。xml文件内容,也包括xxxMapper。xml文件内容。 、build(configuration)publicSqlSessionFactorybuild(Configurationconfig){returnnewDefaultSqlSessionFactory(config);} 就是去new了一个DefaultSqlSessionFactory对象,将configuration作为参数。 、DefaultSqlSessionFactory(configuration)publicDefaultSqlSessionFactory(Configurationconfiguration){this。}3、总结 自此,SqlSessionFactory的创建过程就讲完了,总的来说就是一个封装了配置文件的工厂类。那么得到了SqlSessionFactory这个工厂对象,接下来干嘛?生产SqlSession,然后通过SqlSession进行数据库的增删改查操作 没错,接下来,指北君将给大家介绍SqlSession的交互过程,这也是Mybatis里面最重要的一个对象。