当前位置: 首页 > 科技观察

Mybatis核心类SqlSessionFactory,看完才恍然大悟

时间:2023-03-14 19:22:50 科技观察

大家好,我是北军。小板凳请移步,智贝君将以最通俗易懂、图文并茂的方式为您深入剖析Mybatis的实现原理。在这篇文章中,我们先来分析一下SqlSessionFactory的创建过程。1.示例代码在示例代码中,我们在测试类中写了一个init()方法,其中包含了SqlSessionFactory的构建,分为两步。第一步:读取配置文件mybatis-config.xml输入流第二步:根据输入流构建SqlSessionFactory;publicvoidinit(){//定义mybatis全局配置文件Stringresource="mybatis-config.xml";//加载mybatis全局配置文件InputStreaminputStream=null;尝试{inputStream=Resources.getResourceAsStream(resource);}catch(IOExceptione){e.printStackTrace();}//构造sqlSession工厂sessionFactory=newSqlSessionFactoryBuilder().build(inputStream);}没什么难的,去掉try-catch,两行代码就可以了。InputStreaminputStream=Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactorysessionFactory=newSqlSessionFactoryBuilder().build(inputStream);是的,就是你以为的那两行代码,其实……话不多说,知北君就来给你揭开这冰山之下的秘密。2.代码分析根据上面的时序图,我们根据源码来分析每一步。①.获取配置文件输入流InputStreaminputStream=Resources.getResourceAsStream("mybatis.config.xml");这里没什么好说的,直接获取配置文件的输入流即可。②、这里的build(in)in就是上一步得到的输入流inputStream。publicSqlSessionFactorybuild(InputStreaminputStream){returnbuild(inputStream,null,null);}进入构建方法:publicSqlSessionFactorybuild(InputStreaminputStream,Stringenvironment,Propertiesproperties){try{XMLConfigBuilder,XMLStringenputBuildervi=new,properties);返回构建(解析器。解析());}catch(Exceptione){throwExceptionFactory.wrapException("ErrorbuildingSqlSession.",e);}最后{ErrorContext.instance().reset();尝试{inputStream.close();}catch(IOExceptione){//故意忽略。更喜欢以前的错误。}}}③、XMLConfigBuilder(in)这段代码是解析我们的配置文件,配置文件是XML形式的,我在之前的博客中介绍过几种解析XML的方式。一种是基于树的结构来解析的,称为DOM;另一种是基于事件流的形式,称为SAX和(StAX)。两者各有优缺点。这里我就不细说了。想知道的可以看我的上一篇文章。Mybatis使用DOM形式,结合XPath来解析配置文件。④、parse()publicConfigurationparse(){if(this.parsed){thrownewBuilderException("每个XMLConfigBuilder只能使用一次。");}else{this.parsed=true;this.parseConfiguration(this.parser.evalNode("/configuration"));返回此配置;}}从/configuration标签开始解析。然后我们进入this.parseConfiguration()方法中:privatevoidparseConfiguration(XNoderoot){try{this.propertiesElement(root.evalNode("properties"));属性设置=this.settingsAsProperties(root.evalNode("settings"));this.loadCustomVfs(设置);this.loadCustomLogImpl(设置);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(设置);this.environmentsElement(root.evalNode("environments"));this.databaseIdProviderElement(root.evalNode("databaseIdProvider"));this.typeHandlerElement(root.evalNode("typeHandlers"));这。mapperElement(root.evalNode("mappers"));}catch(Exceptionvar3){thrownewBuilderException("解析SQLMapper配置时出错。原因:"+var3,var3);看看这个是不是眼熟,这不就是mybatis-config.xml配置文件中各个标签的名字吗?对,这个就是解析文件,全部放到配置对象里面。需要注意的是,这里的配置对象不仅包括mybatis-config.xml文件内容,还包括xxxMapper.xml文件的内容。⑤、build(configuration)publicSqlSessionFactorybuild(Configurationconfig){returnnewDefaultSqlSessionFactory(config);}是新建一个DefaultSqlSessionFactory对象,并使用配置作为参数。⑥、DefaultSqlSessionFactory(configuration)publicDefaultSqlSessionFactory(Configurationconfiguration){this.configuration=configuration;}3.综上所述,SqlSessionFactory的创建过程就完成了,通俗的说就是一个封装配置文件的工厂类。那么拿到SqlSessionFactory工厂对象之后,接下来要做什么呢?生产SqlSession,然后通过SqlSession进行数据库的增删改查操作。没错,接下来智贝君就来介绍SqlSession的交互过程,SqlSession也是Mybatis中最重要的对象。