SqlSessionFactory和SqlSessionTemplate[通俗易懂]

SqlSessionFactory和SqlSessionTemplate[通俗易懂]文章目录SqlSessionFactorySqlSessionTemplateSqlSession参考文章链接:全网最通俗易懂理清mybatis中SqlSession、SqlSessionTemplate、SessionFactory和SqlSessionFactoryBean之间的关系Mybatis:了解SqlSessionTemplatemybatis中SqlSessionTemplate的理解SqlSessionFactory是什么?SqlSe…

大家好,又见面了,我是你们的朋友全栈君。

参考文章链接:

SqlSessionFactory

是什么?

  • SqlSessionFactory 是 MyBatis 的重要对象之一,是创建 SqlSession 的工厂。

有什么用?

  • 它的作用就是生成 SqlSession 接口对象,而且重载了许多不同的参数,你可以改变这些参数自定义会话过程中的一些默认行为。例如:可以设置自动提交事务或是关闭自动提交;可以设置获取数据库连接的线程的类型(重用,每次新产生等等);也可以获取整个 Mybatis 的配置信息的 Configuration 对象实例等等。

源码粗读

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.apache.ibatis.session;

import java.sql.Connection;

public interface SqlSessionFactory { 
   
    SqlSession openSession();

    SqlSession openSession(boolean var1);

    SqlSession openSession(Connection var1);

    SqlSession openSession(TransactionIsolationLevel var1);

    SqlSession openSession(ExecutorType var1);

    SqlSession openSession(ExecutorType var1, boolean var2);

    SqlSession openSession(ExecutorType var1, TransactionIsolationLevel var2);

    SqlSession openSession(ExecutorType var1, Connection var2);

    Configuration getConfiguration();
}

SqlSessionFactory 默认也有两个实现类,分别是 DefaultSqlSessionFactory 和 SqlSessionManager,当然你也可以自定义实现类。默认实现是 DefaultSqlSessionFactory。

总而言之,SqlSessionFactory 就是生产 SqlSession 对象的工厂。那也就是说整个 Mybatis 中,如果只有一个数据库 Server 要连接,那么只需要一个工厂就够了(只有一个SqlSessionFactory的实例对象),而 SqlSession 可以自由的被关闭,也就代表SqlSession是需要反复被创建的。上面说到 SqlSession 是关联到具体数据库连接的,但是如果每次创建和销毁都直接操作物理连接的话,那么这个资源浪费很高,效率很低。请看 DefaultSqlSessionFactory 的方法:
在这里插入图片描述
上图是基于数据库连接池实现的,也就是说一次连接用完关闭 SqlSession 实例时,只是把数据库连接对象放回到对象池中,并没有直接销毁,使用池技术,大大提高了物力资源利用率,缩短连接时间、减少了资源利用等。

SqlSessionTemplate

是什么?

  • SqlSessionTemplate 是 MyBatis-Spring 的核心,是 MyBatis 为了接入 Spring 提供的 Bean,这个类负责管理 MyBatis 的 SqlSession。

有什么用?

  • SqlSessionTemplate 通过 TransactionSynchronizationManager 中的 ThreadLocal<Map<Object, Object>> 保存线程对应的 SqlSession,实现 session 的线程安全。
  • SqlSessionTemplate 实现了 SqlSession 接口,这就是说可以对 MyBatis 的 SqlSession 进行简易替换。

源码粗读

public class SqlSessionTemplate implements SqlSession, DisposableBean { 
   
	......
}

可以从源码中发现,SqlSessionTemplate 它是一个类,并且实现了 SqlSession 和 DisposableBean 接口。

SqlSession

接下来我们先了解下 SqlSession 接口,源码如下:

public interface SqlSession extends Closeable { 
   
    <T> T selectOne(String var1);

    <T> T selectOne(String var1, Object var2);

    <E> List<E> selectList(String var1);

    <E> List<E> selectList(String var1, Object var2);

    <E> List<E> selectList(String var1, Object var2, RowBounds var3);
	
	......
}

SqlSession 它又实现了 Closeable 接口,就表示 SqlSession 是可以关闭的,也就是说 SqlSession 是一种可关闭的连接,正如他的名字,session 的意思就是会话,用来维护无状态请求之间的状态信息,SqlSession 表示的是数据库客户端和数据库服务端之间的一种会话,并维护了两者之间的状态信息。

Closeable详解文章链接:https://blog.csdn.net/JOBGONG/article/details/107192026

我们看到,SqlSession 是一个接口,并且里面包含了许多 CRUD 操作数据库等方法。

SqlSession 它有三个实现类,分别是 SqlSessionManager 、DefaultSqlSession 和 SqlSessionTemplate,其中 DefaultSqlSession 它的默认实现类。


值得一提的是,SqlSessionTemplate 除了实现了 Sqlsession 接口之外,还实现了 DisposableBean 接口,这就意味着, SqlSessionTemplate 的实例被 Bean 工厂发现后,会把他们纳入整个spring bean生命周期的管理过程之中,当 BeanFactory 尝试销毁时,Beans 的管理者会以回调的方式调用 SqlSessionTemplate 的 destroy 方法,默认实现是空方法,具体你可以自己重写。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138446.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android游戏开发教程——(绘制屏幕)「建议收藏」

    游戏开发的基本原理:启动一个Activity对象,然后让其显示一个GameCanvas对象(setContentView(GameCanvas));,GameCanvas 里面做游戏逻辑,用户键盘或屏幕输入,屏幕的绘制等这些工作。 那具体怎么做呢?说到重点了。先来讲GameCanvas(游戏画布) 。这是一个类,也就是我们游戏的画布。开发游戏的时候大部分

    2022年3月9日
  • 嵌入式语音识别智能家居笔记1

    嵌入式语音识别智能家居笔记11.环境VMware15.5Ubuntu18.04Qt安装包2.共享目录设置VMware->虚拟机->设置->选项->共享文件夹3.QT的linux安装包:qt-opensource-linux-x64-5.9.1.run复制到共享目录打开终端:cd/mnt/hgfs/sharesudo./qt-opensource-linux-x64-5.9.1.run4.直接搭服务器失败(1)sudodate-s2016-…

    2022年6月26日
  • typora主题修改后保存_typora设置字体

    typora主题修改后保存_typora设置字体typora买了几天了,一直思考什么时候去学习下,毕竟,以前是免费的,没那么多讲究,就是把它当做一个普普通通的编辑器使用。似乎也没有用它的任何功能,甚至连官网文档那么详细的解释都没看;可见,虽然使用着免费的优秀的产品,竟然连最基础的功能都不会。换了个主题,这个是看着官网文档做的。主题下载首先,去下载了一个主题,https://theme.typora.io/;选一个自己喜欢的。设置主题其次,打开偏好设置,找到主题保存的文件夹。操作如下:流程图#mermaid-svg-FyDmLYlb0MV3

    2022年10月28日
  • Qt各种颜色名称及CSS对照表「建议收藏」

    Qt各种颜色名称及CSS对照表「建议收藏」css颜色代码对照参见:https://blog.csdn.net/zy_heu/article/details/78952173

    2022年5月17日
  • 舵机控制原理和结构图_舵机的相关原理与控制原理

    舵机控制原理和结构图_舵机的相关原理与控制原理原文:https://blog.zeruns.tech/index.php/archives/358/什么是PWM信号PWM,英文名PulseWidthModulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平…

    2022年10月26日
  • 蓝墨云班课计算机测试题答案,20155317 第一周蓝墨云班课考题「建议收藏」

    蓝墨云班课计算机测试题答案,20155317 第一周蓝墨云班课考题「建议收藏」201553172016-2017-2蓝墨云班课考题第2周上周蓝墨云班课考题1(单选题|1分)Amdahl定律说明,我们对系统的某个部分做出重大改进,可以显著获得一个系统的加速比。A.正确B.错误正确答案:B解析:课本16页:Amdahl定律的主要思想是:当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。假设系统某部分所需执行时间与…

    2022年10月26日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号