Mybatis核心类SqlSessionFactory,看完
本篇文章我们首先解析SqlSessionFactory的创建过程。1、实例代码
在实例代码中,我们在测试类中写了一个init()方法,里面包括了SqlSessionFactory的构建,分为两步。
第一步:读取配置文件mybatisconfig。xml输入流
第二步:根据输入流构建SqlSessionFactory;publicvoidinit(){定义mybatis全局配置文件Stringresourcemybatisconfig。xml;加载mybatis全局配置文件InputStreaminputStreamnull;try{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。parsedtrue;this。parseConfiguration(this。parser。evalNode(configuration));returnthis。configuration;}}
从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。configurationconfiguration;}3、总结
自此,SqlSessionFactory的创建过程就讲完了,总的来说就是一个封装了配置文件的工厂类。那么得到了SqlSessionFactory这个工厂对象,接下来干嘛?生产SqlSession,然后通过SqlSession进行数据库的增删改查操作
没错,接下来,指北君将给大家介绍SqlSession的交互过程,这也是Mybatis里面最重要的一个对象。
有没有对中考或初中学习很有用的方法或窍门?之前回答了很多初中学习小窍门,今天和大家分享一下应试小窍门语文因为小时候喜欢看闲书,所以一直以来语文都是我不太担心的一门,尤其是作文,掌握了一定套路后作文驾轻就熟,甚至参加了许多次
老百姓过了60岁最担心什么?不用问,老百姓到了60岁最担心没钱养老,养老老百姓过了60岁后,最担心的是老无所依,老无所靠。最担心的是干不动了,说的高文明些,无法为国家做贡献了。说的低自私些,没生活保障了。现在
说说六七十年代你上学时状况?今天我来说说我们70年代初上学时的状况。农村的孩子到8岁的时候就到了入学年龄,那是农村没有幼儿园,入学就直接上一年级。那时候农村差不多,村村有小学。孩子们上学都不用大人接送。学校的
去苏州和杭州两个城市旅游,哪个城市更值得一去?很奇怪这么多人选苏州,很奇怪好多人说杭州除了西湖什么都没有,很抱歉我并不喜欢苏州的园林,或者说我的欣赏水准不够(话说75亩大小20分钟可转一圈的拙政园门票可以标95大洋,如果安静的
北京值得去的不为人知的景点(或展览馆美术馆公园)有哪些?如果时间充足,可以去参观一下电影博物馆汽车博物馆坦克博物馆,这三个地方都是我以前带孩子去过的,感觉很好。如果有比较小的孩子,可以去自然博物馆,以前我们去的时候人有点多。如果前门附近
银行理财亏损会损失全部本金吗?有什么依据?说银行理财损失全部本金几率几乎为0的,都是一知半解的伪金融。事实上银行银行理财亏损,甚至亏损全部的案例并不少,最知名的案例中国银行的原油宝,不但本金全亏,还倒欠银行钱。过往之所以没
有人说临床医学几乎不允许其他学生跨专业考研,那临床医学学生考研录取率是不是高一点?感谢邀请!首先,临床医学专业考研不允许其他专业考是因为此专业的特殊性和专业技能的要求强。临床医学专业具有高度的专业性,并不是说没有上过本科的,其他专业的学生就可以驾驭得了的。所以国
过不了央美,清美,国美,美术生是应该走综合性大学还是专业美院?以一个一线美术高考教师的角度来谈的话1绝大多数孩子走美术高考,不是因为热爱美术。这种情况下,走美院还是走综合性大学,没啥区别的。2走美术高考的孩子中,绝大多数不是要当职业艺术家,将
教育部将严格审批学院更名大学,大学比学院好吗?教育部将严格审批学院更名大学这个事宜,这是一个好事情。现在我们国家的大学都在想方设法提升自己,提升排名,扩大影响力。不少学院都希望变成大学。在我们国家目前的情况下,学院变成大学基本
中国男人穿西装好像越来越少了,以后还会日常化吗?说起来,挺有趣的,中国80,90年代流行过西装热而且还发展出衣服宽大的中国风格,那时候,出门经常穿西装,甚至有时候干活,买东西时甚至也穿着西装那时候中国刚刚改革开放,国家还比较穷,
如何修复痘坑?痘坑其实就是一种疤痕,有痘坑的那部分皮肤已经受损了,需要用具有修复效果的精华类产品修复,一定要坚持使用,才能看得见效果!推荐使用以下几款产品,可以修复痘坑城野医生EGF精华EGF能