文章目录

  • SqlSessionFactory
  • SqlSessionTemplate
    • SqlSession

参考文章链接:

  • 全网最通俗易懂理清mybatis中SqlSession、SqlSessionTemplate、SessionFactory和SqlSessionFactoryBean之间的关系
  • Mybatis:了解SqlSessionTemplate
  • mybatis中 SqlSessionTemplate的理解

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 默认也有两个实现类,分别是 DefaultSqlSessionFactorySqlSessionManager,当然你也可以自定义实现类。默认实现是 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 它是一个类,并且实现了 SqlSessionDisposableBean 接口。

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 它有三个实现类,分别是 SqlSessionManagerDefaultSqlSessionSqlSessionTemplate,其中 DefaultSqlSession 它的默认实现类。


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

SqlSessionFactory和SqlSessionTemplate相关推荐

  1. 解决java.lang.IllegalArgumentException:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requir

    文章目录 1. 复现问题 2. 分析问题 2.1 检查是否引入了mybatis的jar包 2.2 检查启动类的配置 2.3 检查xml文件对应java类的配置是否有误 2.4 检查applicatio ...

  2. shardingsphere启动的时候报错Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

    https://github.com/apache/shardingsphere/issues/5697 https://blog.csdn.net/gaofengxu123/article/deta ...

  3. 【Spring】Spring Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

    文章目录 1.概述 1.概述 是这样的,我把内网的代码,拿到了云环境,然后发现很多需要手动引入,原本代码是能运行的,但是这里面居然需要手动引入某些包.然后我引入了 <dependency> ...

  4. java.lang.IllegalArgumentException: Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requir

    SpringBoot项目启动报错 网上对于这个错误有好多的解决方案,找了好多文档都是不好使,最后竟然发现pom 文件缺少: 加入下方依赖即可(切记 加入依赖一定下要刷新下 pom  重新引入) < ...

  5. Property #39;sqlSessionFactory#39; or #39;sqlSessionTemplate#39; are required

    之前一直用mybatis+mybatis-spring-1.1.1,系统升级mybatis使用后 mybatis-spring-1.2.2, 再其他配置均为改动的情况下执行出错: Property ' ...

  6. SqlSessionTemplate是如何保证MyBatis中SqlSession的线程安全的?

    2019独角兽企业重金招聘Python工程师标准>>> 一.DefaultSqlSession的线程不安全性 在MyBatis架构中SqlSession是提供给外层调用的顶层接口,实 ...

  7. Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory

    一.摘要 上两篇文章分别介绍了Spring3.3 整合 Hibernate3.MyBatis3.2 配置多数据源/动态切换数据源 方法 和 Spring3 整合Hibernate3.5 动态切换Ses ...

  8. MyBatis-Spring(四)--MapperFactoryBean实现增删改查

    上一篇文章中提到,使用SqlSessionTemplat时需要输入一长串字符串来获取mapper,这种方式IDE不会检查程序的准确性并且很容易出错,所以这篇文章介绍另一种可以避免这种问题,并且也可以使 ...

  9. Springboot 中 Mybatis 的使用

    2019独角兽企业重金招聘Python工程师标准>>> 官方文档: Mybatis开发团队为Spring Boot 提供了 MyBatis-Spring-Boot-Starter 方 ...

  10. Springboot启动原理解析

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 我们开发任何一个Spring Boot项目,都会用到如下的启动类 @SpringBootAppl ...

最新文章

  1. 详解:Drools规则引擎探究
  2. Ext2、Ext3和Ext4之间的区别
  3. Flash中如何使用滤镜
  4. CentOS7.0 安装nginx-1.9.10
  5. android通讯录上传服务器,Android 实现读取通讯录并上传服务器
  6. word 2007 文档中添加文件
  7. 10个步骤的筛选器模式
  8. Android 10分钟集成极光推送
  9. 清华大学《操作系统》(九):进程和线程
  10. sift算法_单应性Homograph估计:从传统算法到深度学习
  11. 300张小抄表搞定机器学习知识点:学习根本停不下来!
  12. Blog运用感想 (ZT)
  13. 「Leetcode」707.设计链表:一道题目考察了常见的五个操作!
  14. 诺诺打赏源码_2020二开诺诺视频打赏源码/VIP付费看视频带试看 已对接支付+代理...
  15. 清除docker镜像缓存
  16. mysql数据库技术答案_高校邦《MySQL数据库高级技术》全套答案
  17. JAVA 根据商品属性生成(SKU)规格算法
  18. IDM短信发送接口设计说明
  19. 一个区块链美女小白的蜕变——我庆幸自己能生活在这个高速时代!
  20. 集群断电重启The connection to the server apiserver.k8s:6443 was refused - did you specify the right

热门文章

  1. 小结Python的中文处理(转)
  2. UVA 993 Product of digits
  3. Asp.Net中的正则表达式问题可以在此提问,今后大家一起研究!贴出基本语法参考...
  4. 走进 JDK 之谈谈字符串拼接
  5. 一次完整的react hooks实践
  6. linux三剑客之awk
  7. 第1章 异常产生异常处理
  8. [BalticOI2002]Bicriterial routing
  9. HDU 2604 Queuing( 递推关系 + 矩阵快速幂 )
  10. BRVAH分组功能原理分析