我潇洒的灰大狼又回来啦。今天送你们的一句话是:spring
保持耐心,永远年轻,永远热泪盈眶。sql
前言
先容我哭一下子,呜呜呜~昨晚写了一半的文章,还没保存就盖上盖子准备回家,拔下电源准备把电脑塞进书包带回家完成时,懒惰阻止了我,最终仍是没带回家,因而,遭报应了,今天早上来,电脑直接就是没电关机了,开机后写的文章再也找不回来了...(不争气的mac真是对不起我前面特意写了一篇文章来夸赞mac真香啊...)数据库
Thread.sleep(5000);//crying...springboot
回归正题,开始含泪创做了。session
不少初学者在学习mabatis或者看公司的mybatis项目时,老是搞不清楚SqlSessionSql、SqlSessionTemplate、SessionFactory和SqlSessionFactoryBean这几者之间的关系,尤为是咱们在看别人的代码时,不一样的项目都是不一样的人完成的,风格迥异,有人用spring配置的形式,有人用springboot硬编码的形式,更有复杂点的项目,使用了读写分离等等,很容易让人懵圈。这篇文章的目的就是用通俗易懂的方式给你们理清这几者之间的关系。如若您发现文章某些部分难以理解,或者有错误,还望不惜笔墨,吾当虚心接受,感激不尽。如若您以为有帮助,点个赞支持下,感谢感谢~mybatis
来,打起精神来。并发
正文
SqlSession和SqlSessionTemplate
首先给你们带来的是SqlSession和SqlSessionTemplate之间的关系,先看图,再看描述。学习
SqlSession实现了Closeable接口,表明SqlSession是能够关闭的,那也就是说SqlSession表明一种可关闭的链接。正如他的名字,session表示的是一个会话,用来维护无状态请求之间的状态信息,放在数据库这里,SqlSession表示的是数据库客户端和数据库服务端之间的一种会话,并维护了二者之间的状态信息。编码
咱们看到,SqlSession是一个接口,里面有咱们熟悉的操做数据库执行sql语句的select、insert、update等方法,是否是很熟悉。spa
SqlSession有三个实现类,固然,你也能够本身实现。DefaultSqlSession是它的默认实现类,固然,还有咱们熟悉的SqlSessionTemplate实现类。小伙伴们是否是已经打开代码开始看了,若是尚未,我建议你打开源码,跟着个人思路往下走。
聪明的你是否是早就已经发现了,DefaultSqlSession和SqlSessionTemplate差异很大,可是我们此次讨论的重点是SqlSessionTemplate,就不展开讲述他们之间的区别了,其实若是你能认真看到最后,你就天然就清楚区别了。
值得一提的是,SqlSessionTemplate除了实现了Sqlsession接口以外,还实现了DisposableBean接口,这就意味着,SqlSessionTemplate的实例被Bean工厂发现后,会把他们归入整个spring bean生命周期的管理过程之中,当BeanFactory尝试销毁时,Beans的管理者会以回调的方式调用SqlSessionTemplate的destroy()方法。
默认实现是空方法,具体你能够本身重写。
总结一下,SqlSessionTemplate是SqlSession的实现类,如其名,是sqlSession模板,有了SqlSessionTemplate,咱们就能用来执行Dao层的Sql语句。说了这么多,其实关键就一点,SqlSessionTmplate是SqlSession的实现类,而这个实现类中有一个关键的类就是SqlSessionFactory。
SqlSessionFactory和SqlSessionFactoryBean
SqlSessionFactory也是一个接口,是SqlSession工厂,他的能力就是打开一个SqlSession会话,并且重载了许多不一样的参数,你能够改变这些参数自定义会话过程当中的一些默认行为。例如:能够设置自动提交事务或是关闭自动提交;能够设置获取数据库链接的线程的类型(重用,每次新产生等等);也能够获取整个Mybatis的配置信息的Configuration对象实例等等。
SqlSessionFactory默认也有两个实现类,固然你也能够自定义实现类。默认实现是DefaultSqlSessionFactory。
总而言之,SqlSessionFactory就是生产SqlSession对象的工厂。那也就是说整个Mybatis中,若是只有一个数据库Server要链接,那么只须要一个工厂就够了(只有一个SqlSessionFactory的实例对象),而SqlSession能够自由的被关闭,也就表明SqlSession是须要反复被建立的。上面说到SqlSession是关联到具体数据库链接的,可是若是每次建立和销毁都直接操做物理链接的话,那么这个资源浪费很高,效率很低。请看DefaultSqlSessionFactory的方法:
上图是基于数据库链接池实现的,也就是说一次链接用完关闭SqlSession实例时,只是把数据库链接对象放回到对象池中,并无直接销毁,使用池技术,大大提升了物力资源利用率,缩短链接时间、减小了资源利用等。
讲到这里,细心的小伙伴们可能有个疑问,SqlSessionFactory是怎么建立SqlSession的,或者更具体点,是怎么建立SqlSessionTemplate的,这就不得不说动态代理了。这部分是在SqlSessionTemplate中实现的,具体细节我下期再从源码角度给你们分享。
所剩很少了,再坚持坚持,坚持看完。
接下来要说的是SqlSessionFactoryBean,老规律,类图以下:
实现了ApplicationListener接口,表明SqlSessionFactoryBean有能力监控 Application发出的一些事件通知。
实现了FactoryBean接口,表明SqlSessionFactoryBean的实例再也不是一个普通的bean对象,而是能够产生本身Bean的一个工厂,而且产生的Bean会被归入spring的生命周期,这里产生的Bean指的就是SqlSessionFactory。
实现了InitializingBean接口,表明SqlSessionFactoryBean中的afterPropertiesSet()方法会在Bean初始化属性完成后当即被调用。
如其名,SqlSessionFactoryBean是生产SqlSessionFactory的工厂bean。
综上所述
SqlSessionFactoryBean是生产SqlSessionFactory的一种工厂bean。
SqlSessionFactory是打开SqlSession会话的工厂,是一个接口,能够根据需求本身实现,它的默认实现类DefaultSqlSessionFactory使用了数据库链接池技术。
SqlSession是客户端和数据库服务端之间的会话信息,里面有许多操做数据库的方法。
SqlSessionTemplate是SqlSession的一个具体实现。
写在最后
写到这里,不知道小伙伴们是否已经搞清楚他们之间的关系了呢。上面讲的其实比较浅显,主要是从结构上给你们梳理了下他们之间的关系,以及它们每个的做用,可是这还远远不够,就像上面提到的,SqlSessionTemplate和SqlSession、SqlSessionFactory之间的纠缠究竟是怎么样的?DataSource、Connection是怎么发挥做用的?以及咱们的代码中是如何产生Sql语句并发送给数据库Server的?
爱学习的大家,是否是火烧眉毛想要一探究竟了,关注我,且听我灰大狼下期经过源码的方式给大家一一拆解。
有帮助?点个赞再走呗~感谢各位老铁的支持~