SqlSessionFactory、SqlSessionFactoryBean、SqlSession和SqlSessionTemplate的不解姻缘系列之一(总体阐述)

写在之前

最近在使用Mybatis的时候很是好奇一些实现细节,所以也就多留意了下。 SqlSessionFactory、SqlSessionFactoryBean、SqlSession和SqlSessionTemplate是大家直接使用比较多的。这里我先不说这些类的实现细节,先大致说下它们之间的关系,相信会有同样的人对于它们之间的关系感兴趣。设计者设计这个类的时候肯定是有目的性的,搞清楚目的性再去看实现源码才会有方向性,从而达到事半功倍的效果。我会结合自己的理解,连续通过几篇文章来讲述下它们之间的感情纠葛,并结合生成环境中的常用方式进行实例说明。若是您发现文章有错误的地方,还望不惜笔墨,吾当虚心接受,感激涕零。

正文

1. SqlSession和SqlSessionTemplate

SqlSession

SqlSession实现了Closeable接口,代表SqlSession是可以关闭的,那也就是说SqlSession代表一种可关闭的连接,也正如名字所表达的是Session,Session对于开发人员来说并不陌生。例如:浏览器和服务器之间的会话也是Session,Session用来维护无状态请求之间的状态的信息。所以说SqlSession也是一种会话,数据库连接客户端和数据库Server之间的一种会话,并维护了客户端和数据库Server的一些状态信息。

看源码中的描述:

SqlSession

SqlSession是接口,接口是一种高层次的抽象,你可以认为接口是声明了一种能力。。若是实现了该接口,就拥有了该接口的能力(方法)和特征(属性)。官方的描述是:“你可以通过它执行命令、获取mapper和管理事务”。那也就是说,只要我实现了SqlSession接口,那我就有了同样的能力了。至于它是如何实现发送sql语句,管理事务和获取mapper的,这是后话,后续再说。

我们再来看看,实现了SqlSession的类有哪些?

SqlSession的实现类

正如图中所示,DefaultSqlSession是SqlSession接口的默认实现;SqlSessionTemplate也是SqlSession的一种实现。SqlSessionTemplate除了实现了SqlSession接口外,还是实现了下面的接口:

SqlSessionTemplate

实现了DisposableBean接口,也就代表了SqlSessionTemplate的实例被Bean工厂发现后,会把它们纳入整个生命周期的管理过程中,当BeanFactory被尝试销毁时,Beans的管理者会以回调的方式调用SqlSessionTemplate的destroy()方法。 我们来看看SqlSessionTemplate的destroy()方法的实现:

destroy()方法

默认实现是空方法,具体实现你自己可以重写。

2. SqlSessionFactory和SqlSessionFactoryBean

SqlSessionFactory

如上图,SqlSessionFactory也是一种抽象定义,其能力(方法 )就是打开一个会话(客户端和数据库Server),而且重载了很多不同的参数,你可以改变这些参数自定义会话过程中的一些默认行为。例如:可以设置自动提交事务或是关闭自动提交;可以设置获取数据库连接的线程的类型(重用,每次新产生等等);也可以获取整个Mybatis的配置信息的Configuration对象实例,关于Configuration的讨论我们下期再说。

SqlSessionFactory的实现

SqlSessionFactory的实现也有两种,甚至你可以自定义实现。默认实现是DefaultSqlSessionFactory

DefaultSqlSessionFactory

DefaultSqlSessionFactory具体实现了SqlSessionFactory接口定义的抽象行为。总而言之,SqlSessionFactory就是生产SqlSession对象的工厂。那也就是说整个Mybatis中,如果只有一个数据库Server要连接,那么只需要一个工厂就够了(只有一个SqlSessionFactory的实例对象),而SqlSession可以自由的被关闭,也就代表SqlSession是需要反复被创建的。上面说到SqlSession是关联到具体数据库连接的,但是如果每次创建和销毁都直接操作物理连接的话,那么这个资源浪费很高,效率很低。请看DefaultSqlSessionFactory的方法:

DefaultSqlSessionFactory的方法

上图的实现中是有基于连接池技术的。使用数据库连接池时,关闭SqlSession实例 ,其实只是把数据库连接对象(代表物理资源)放回到对象池中,并没有直接销毁,使用连接池技术极大提高了物理资源利用率,缩减了创建物理连接所需的时间、资源等等。

SqlSessionFactoryBean

如上图,SqlSessionFactoryBean直接实现了三个接口。实现ApplicationListener代表SqlSessionFactoryBean有能力监控 Application发出的一些事件通知;实现InitializingBean代表SqlSessionFactoryBean中的afterPropertiesSet()方法会在Bean初始化属性完成后立即被调用;实现了FactoryBean代表SqlSessionFactoryBean的实例不再是普通的Bean对象,而是可以产生自己Bean的一种工厂,该工厂产生的Bean同样可以被纳入Spring的生命周期。

FactoryBean的官方描述

正如SqlSessionFactoryBean的名字,它是生产SqlSessionFactory的工厂Bean。

综上所述,SqlSessionFactoryBean是生产SqlSessionFactory的一种工厂Bean;SqlSessionFactory是一种生产SqlSession的工厂;SqlSession是代表数据库连接客户端和数据库Server之间的会话信息;SqlSessionTemplate是SqlSession的一个具体实现。如下图:

关系图

说明:图中的蓝色箭头不代表继承的含义。

写在最后

看完上面的大致讲述后,你会不会有些问题要问呢?比如:既然SqlSessionFactory是产生SqlSession的了,那干嘛又搞出来SqlSessionTemplate呢?它到底是干嘛的呢?说到SqlSessionTemplate和SqlSession、SqlSessionFactory之间的纠缠,就不得不说动态代理了。下期我们将讲述SqlSessionTemplate的实现细节,我们的代码中是如何产生Sql语句并发送给数据库Server的,通过进一步的分析让你更加了解Mybatis的实现细节末梢。预知后事如何,且看下回分解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,422评论 0 4
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,163评论 11 349
  • 单独使用mybatis是有很多限制的(比如无法实现跨越多个session的事务),而且很多业务系统本来就是使用sp...
    七寸知架构阅读 3,421评论 0 53
  • 1 引言# 本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybait...
    七寸知架构阅读 76,410评论 36 980
  • 01 同事们在议论:“你们知道吗?上个月西安又一个女的跳楼了,还是带着儿子一起跳的,据说又是因为抑郁。好可怕啊,我...
    朴素者阅读 3,514评论 2 5