大家好,又见面了,我是你们的朋友全栈君。
参考文章链接:
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
