一个宁静祥和没有bug的下午和SqlSession的故事

一个,宁静,祥和,没有,bug,下午,sqlsession,故事 · 浏览次数 : 465

小编点评

**背景** 下午是安静祥和无bug的下午,我开始探索学习使用mybatis如何使用。 **探索之旅** 1. 我们知道sqlSession来自于sqlSessionFactory,而sqlSessionFactory可以通过sqlSessionFactoryBuilder创建,也可以通过spring初始化。 2. 那么我们已经得到了sqlSessionFactory,应该如何去进一步探索sqlSession的来源呢? 3. 仔细阅读SqlSessionDaoSupport这个类后,终于被我发现了线索,就在上图之中的注释中,“用户应该使用这个方法来获得一个SqlSession来执行sql语句,这个SqlSession被spring管理,用户不应该提交、回滚或关闭它。因为这些已经被自动执行了。” 4. 于是这个SqlSession是从何而来的呢,从上图可以看出,它有两种赋值方式,一种是给他传一个SqlSessionFactory,生成SqlSessionTemplate,SqlSessionTemplate即为sqlSession。另一种是直接给他传一个SqlSessionTemplate作为SqlSession。 5. 根据本类的注释,如果SqlSessionFactory和SqlSessionTemplate都被定义了,那么SqlSessionFactory的方式会失效。 **总结** 1. Mybatis,spring,项目以及我的疑问得到了统一,真是一个宁静祥和而又没有bug的下午呀。 2. 作者以马跃向我们介绍了如何使用mybatis学习学习的流程。

正文

1 背景

这是一个安静祥和没有bug的下午。
作为一只菜鸡,时刻巩固一下基础还是很有必要的,如此的大好时机,就让我来学习学习mybatis如何使用。

这可和我看到的不一样啊,让我来看看项目里怎么写的。

我们项目中的Dao都继承于BaseDao,而BaseDao继承于SqlSessionDaoSupport,每次执行sql的时候都是直接将这个sqlSession返回,然后执行sql,这难道不是一个实例变量嘛?这和你说的可不一样诶。于是带着这样的疑问,我开始了探索。

2 探索之旅

1)我们都知道,在使用mybatis时,sqlSession都来自于sqlSessionFactory,而sqlSessionFactory可以通过sqlSessionFactoryBuilder创建,也可以通过spring初始化,而项目中很显然采取了后一种方式。

2)那么我们已经得到了sqlSessionFactory,应该如何去进一步探索sqlSession的来源呢,我想到可以通过项目中已经实现的dao进行探索。我们随便选取一个dao为例。

它继承了BaseDao。

而BaseDao又继承了SqlSessionDaoSupport,在BaseDao中调用了getSqlSession方法,实际上也就是SqlSessionDaoSupport的getSqlSession方法。

而SqlSessionDaoSupport的getSqlSession方法是直接将自己的成员变量返回去的,截至目前为止,和我的怀疑点是相符合的,即目前的写法和mybatis官网的说明是冲突的。

3)反复阅读SqlSessionDaoSupport这个类后,终于被我发现了线索,细心的小伙伴应该也早已发现了,就在上图之中的注释中,“用户应该使用这个方法来获得一个SqlSession来执行sql语句,这个SqlSession被spring管理,用户不应该提交、回滚或关闭它。因为这些已经被自动执行了。”

同时,这个方法会返回一个线程安全的SqlSession。

那么这个SqlSession是从何而来的呢,从上图可以看出,它有两种赋值方式,一种是给他传一个SqlSessionFactory,生成SqlSessionTemplate,SqlSessionTemplate即为sqlSession。另一种是直接给他传一个SqlSessionTemplate作为SqlSession。根据本类的注释,如果SqlSessionFactory和SqlSessionTemplate都被定义了,那么SqlSessionFactory的方式会失效。至此,我的上述疑问已经解决了,也就是说这个SqlSession并不是一个mybatis初始的SqlSession,而是spring实现的SqlSessionTemplate。

4)但是,我又诞生了新的疑问,SqlSessionTemplate是怎么完成线程安全的呢?

于是我进入了SqlSessionTemplate的方法执行,发现实际执行语句的都是这个代理类sqlSessionProxy。

而代理工作内容就在SqlSessionInterceptor这个handler里。

进入其中,我们终于发现了它的获取和关闭操作。

也就是说,每次执行,代理都会调用sessionFactory的openSession方法获得一个新的session。

3 总结

终于的终于,mybatis,spring,项目以及我的疑问得到了统一,真是一个宁静祥和而又没有bug的下午呀。


作者:马跃

与一个宁静祥和没有bug的下午和SqlSession的故事相似的内容:

一个宁静祥和没有bug的下午和SqlSession的故事

1 背景 这是一个安静祥和没有bug的下午。作为一只菜鸡,时刻巩固一下基础还是很有必要的,如此的大好时机,就让我来学习学习mybatis如何使用。 这可和我看到的不一样啊,让我来看看项目里怎么写的。 我们项目中的Dao都继承于BaseDao,而BaseDao继承于SqlSessionDaoSuppo

[转帖]拯救关键业务上线:DBA 的惊魂24小时

一个电话,打破深夜的宁静 9月20日晚上10点 刚完成外地一个重点项目为期2周的现场支持,从机场回家的路上,一阵急促的铃声惊醒了出租车上昏昏欲睡的我,多年的工作经验告诉我这么晚来电一定是出事了,接起电话,是KS。 KS正在跟一个国内关键客户数据库国产化替代项目,该项目核心业务系统由Oracle替换为

冬日里的夏日火花

在春寒料峭的三月,万物尚未完全从冬日的沉睡中苏醒,城市的每一个角落还残留着几分凉意。3月29日,一个看似平凡的周三下午,阳光懒散地洒在李白的办公桌上,他的手指正不自觉地在键盘上跳跃,处理着日常的工作事务。正当他沉浸在数字与报表的世界中时,一阵清脆的手机铃声划破了办公室的宁静。 接听电话,传来的是一个

【SQL】晨光咖啡馆,过滤聚合的微妙碰撞

这天,小悦懒洋洋地步入办公楼下的咖啡馆,意外地与一位男子不期而遇。他显然因前一晚的辛勤工作而略显疲惫,却仍选择早到此地,寻找一丝宁静与放松。他叫逸尘,身姿挺拔,衣着简约而不失格调,晨光下更显英俊不凡,吸引了周遭的目光。两人仿佛心有灵犀,不约而同地走向各自的位置。 小悦手中轻握着新出炉的拿铁,眼睛紧紧

一个难忘的json反序列化问题

前言 最近我在做知识星球中的商品秒杀系统,昨天遇到了一个诡异的json反序列化问题,感觉挺有意思的,现在拿出来跟大家一起分享一下,希望对你会有所帮助。 案发现场 我最近在做知识星球中的商品秒杀系统,写了一个filter,获取用户请求的header中获取JWT的token信息。 然后根据token信息

一个用来画拉氏图的简单Python脚本

这里我提供了一个用于画拉氏图的Python脚本源代码,供大家免费使用。虽然现在也有很多免费的平台和工具可以用,但很多都是黑箱,有需要的开发者可以直接在这个脚本基础上二次开发,定制自己的拉氏图绘制方法。

Simple WPF: WPF 透明窗体和鼠标事件穿透

一个自定义WPF窗体的解决方案,借鉴了吕毅老师的WPF制作高性能的透明背景的异形窗口一文,并在此基础上增加了鼠标穿透的功能。可以使得透明窗体的鼠标事件穿透到下层,在下层窗体中响应。

NetMvc通过亚马逊方式服务器端和客户端上传MinIO顺利解决

前言: 1、由于项目是.NET Framework 4.7 MVC LayUI,所以需要找一个资源站点存放项目中静态资源文件; 2、需要支持服务端和客户端都支持上传文件方式; 3、调用简单,涉及库越少越好。 结果: 调用 AWSSDK.S3 和 AWSSDK.Core 实现文件上传到 MinIO ;

MinIO 图片转文件的分界线RELEASE.2022-05-26T05-48-41Z

前言:本人想用MinIO存储文件,但是不想最新版本Mete文件,于是各种寻找于是终于找到办法了,原来是官方版本更新导致的。需要我们去寻找相应的版本。 1、官网下载网站 https://dl.min.io/server/minio/release/windows-amd64/archive/minio

WIndow Server 2019 服务器 MinIO下载并IIS配置反向代理

1、官网下载并配置 下载MinIO Serve地址(不需要安装,放在目录就行) https://dl.min.io/server/minio/release/windows-amd64/minio.exe 设置账号和密码(cmd) setx MINIO_ROOT_USER admin setx MI