我潇洒的灰大狼又回来啦。今天送大家的一句话是:
保持耐心,永远年轻,永远热泪盈眶。
前言先容我哭一会儿,呜呜呜~昨晚写了一半的文章,还没保存就盖上盖子准备回家,拔下电源准备把电脑塞进书包带回家完成时,懒惰阻止了我,最终还是没带回家,于是,遭报应了,今天早上来,电脑直接就是没电关机了,开机后写的文章再也找不回来了...(不争气的mac真是对不起我前面特地写了一篇文章来夸赞mac真香啊...)
Thread.sleep(5000);//crying...
回归正题,开始含泪创作了。
很多初学者在学习mabatis或者看公司的mybatis项目时,总是搞不清楚SqlSessionSql、SqlSessionTemplate、SessionFactory和SqlSessionFactoryBean这几者之间的关系,尤其是我们在看别人的代码时,不同的项目都是不同的人完成的,风格迥异,有人用spring配置的形式,有人用springboot硬编码的形式,更有复杂点的项目,使用了读写分离等等,很容易让人懵圈。这篇文章的目的就是用通俗易懂的方式给大家理清这几者之间的关系。如若您发现文章某些部分难以理解,或者有错误,还望不惜笔墨,吾当虚心接受,感激涕零。如若您觉得有帮助,点个赞支持下,感谢感谢~
来,打起精神来。
正文 SqlSession和SqlSessionTemplate首先给大家带来的是SqlSession和SqlSessionTemplate之间的关系,先看图,再看描述。
SqlSession实现了Closeable接口,代表SqlSession是可以关闭的,那也就是说SqlSession代表一种可关闭的连接。正如他的名字,session表示的是一个会话,用来维护无状态请求之间的状态信息,放在数据库这里,SqlSession表示的是数据库客户端和数据库服务端之间的一种会话,并维护了两者之间的状态信息。
我们看到,SqlSession是一个接口,里面有我们熟悉的操作数据库执行sql语句的select、insert、update等方法,是不是很熟悉。
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和SqlSessionFactoryBeanSqlSessionFactory也是一个接口,是SqlSession工厂,他的能力就是打开一个SqlSession会话,而且重载了许多不同的参数,你可以改变这些参数自定义会话过程中的一些默认行为。例如:可以设置自动提交事务或是关闭自动提交;可以设置获取数据库连接的线程的类型(重用,每次新产生等等);也可以获取整个Mybatis的配置信息的Configuration对象实例等等。
SqlSessionFactory默认也有两个实现类,当然你也可以自定义实现类。默认实现是DefaultSqlSessionFactory。