2021-10-01 mybatis ---- SqlSession、SqlSessionFactory、SqlSessionFactoryBean之间的关系

2021/10/1 19:11:01

本文主要是介绍2021-10-01 mybatis ---- SqlSession、SqlSessionFactory、SqlSessionFactoryBean之间的关系,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

mybatis ---- SqlSession、SqlSessionFactory、SqlSessionFactoryBean之间的关系

  • 前言
  • SqlSession 接口
    • SqlSession 接口 —— 实现类 DefaultSqlSession
  • SqlSessionFactory 接口
    • SqlSessionFacytoryBuilder
    • SqlSessionFactory 接口 —— 实现类 DefaultSqlSessionFactory
    • SqlSessionFactory 接口 —— 实现类 SqlSessionManager
  • SqlSessionFactoryBean 实体类
    • SqlSessionTemplate 实体类
    • SqlSessionManager 实体类
  • 总结

前言

在学习mybatis的过程中想必不知道mybatis是如何执行的,为什么能帮我执行sql语句,以及第一次执行sql语句的时候创建SqlSession、SqlSessionFactory、SqlSessionFactoryBean实例之间的联系。

SqlSession 接口

在这里插入图片描述

由上图可知,SqlSession是执行sql语句的对象接口,执行增删改查的规范接口

在这里插入图片描述
SqlSession接口有三个实现类:DefaultSqlSession、SqlSessionManager、SqlSessionTemplate
现在我们知道SqlSession接口用来执行sql语句,那么这三个实现类实现了执行sql语句的方法,到底有什么区别呢?

SqlSession 接口 —— 实现类 DefaultSqlSession

在这里插入图片描述

DefaultSqlSession是真正实现了SqlSession接口的实现类,为什么它是真正的实现类?不是还有SqlSessionManager和SqlSessionFactory吗?让我们来看看它们到底实现了什么

首先看下图,SqlSessionManager(等等你怎么还继承Factory工厂???,你不是SqlSession的实现类吗)通过看下图,我们就知道事情没有这么简单,既然它实现了SqlSessionFactory接口,那么这里我们暂时先知道它不只是一个sqlSession那么简单

在这里插入图片描述
接着我们看下图,SqlSessionTemplate(等等没有继承Factory接口,但你怎么还有个SqlSessionFactory成员),同理可得它也没有那么简单
在这里插入图片描述

至于这两个实现类我们到后面再介绍它封装哪些。

SqlSessionFactory 接口

SqlSession是操作数据库的接口,SqlSessionFactory 则是创建这些“SqlSession操作数据库对象”的工厂类接口
在这里插入图片描述
SqlSessionFactory接口是真正创建工厂实现类另有其人(类),就是DeaultSqlSessionFactory和SqlSessionManager,先别急让我们一步一步慢慢来,将SqlSession的体系全部阅览一遍
在这里插入图片描述

SqlSessionFacytoryBuilder

通过前面的了解,真正执行sql的是SqlSession接口的实体类,而工厂类是创建这些实体类的工厂类(就像实际工厂一样流水线一般重复同样的事情,这里是指创建SqlSession实体类)。那么SqlSessionFacytoryBuilder,你跟我SqlSessionFacytory又有什么关系呢?

下面这些步骤想必第一次执行的时候,不知道它们是如何运行的;就让我们看看SqlSessionFacytoryBuilder跟SqlSessionFacytory到底有什么关系;首当其冲(可能用词不当,但偏用)先看看第一次看到SqlSessionFacytoryBuilder的情景,也就是我们第一次执行sql的时候

	//1.获取mybatis-config.xml(以流的方式获取文件内的配置信息)
	String resource = "mybatis-config.xml";
	InputStream inputStream = Resources.getResourceAsStream(resource);

	//2.通过SqlSessionFacytoryBuider获取SqlSessionFactory工厂(通过流获取到的配置信息,去创建一个sqlSessionFactory工厂)
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

	//3.再通过SQLSessionFacytory获取SqlSession执行我们的XXXmapper.xml的sql语句
	SqlSession sqlSession = sqlSessionFactory.openSession();
	try {
		EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);	//获取mapper对象
        List<Employee> emps = mapper.getEmps();	//执行sql语句
        for (Employee emp : emps) {	//遍历得到数据库数据
        	System.out.println(emp);
        }
        sqlSession.commit();
	} finally {
		sqlSession.close();
	}

它们到底是如何创建的呢?

我们获取mybatis的配置文件输入流,通过sqlSessionFacytoryBuilder.buil()方法,获取SqlSessionFactory工厂实例创建SqlSession。其中实现细节我们并不知道,通过下面几张图片可以了解其中的详细细节。

  • new SqlSessionFacytoryBuilder().buir(InputStream );实际上调用的是重载的build(Reader,String,Properties)

在这里插入图片描述

  • 他帮我们将流获取到的配置信息封装成了实例对象,去调用buil(Configuration)
    在这里插入图片描述

  • buil(Configuration)帮我们真正创建了SqlSessionFactory接口的工厂实例DefaultSqlSessionFactory;
    在这里插入图片描述

**至此我们也就知道日常中我们通过SqlSessionFactoryBuilder创建的工厂,实际上通过配置文件,创建的DefaultSqlSessionFactory实例。**这里我们也就知道了SqlSessionFactoryBuilder和SqlSessionFactory的关系

SqlSessionFactory 接口 —— 实现类 DefaultSqlSessionFactory

前面说了SqlSessionFactoryBuilder实际就是创建了DefaultSqlSessionFactory对象,那么DefaultSqlSessionFactory是干什么的呢,让我们先看下图
在这里插入图片描述

DefaultSqlSessionFactory只有一个有参构造函数,参数是Configuration(配置),再通过openSession方法调用openSessionFromDataSource方法返回SqlSession;都到这里了,我们肯定要看看它是怎么创建SqlSession;

在这里插入图片描述

果然不出我们所料,在前面SqlSession的接口中我们说过“SqlSession接口真正的实现类是DefaultSqlSession”,一看方法内,果然是new了一个DefaultSqlSession的是咧,返回给我们,这里我们也就知道了DefaultSqlSessionFactory这个工厂类,实际就是通过我们配置的mybatis的配置文件,去创建SqlSession对象也就是DefaultSqlSession的对象

SqlSessionFactory 接口 —— 实现类 SqlSessionManager

这我们也暂时不讲,在SqlSessionFactoryBean我们进行再进行讲述

SqlSessionFactoryBean 实体类

第一次看见SqlSessionFactoryBean是在ssm整合中,肯定会有一个疑问,之前都是通过SqlSessionFactory工厂(真正实例DefaultSqlSessionFactory)创建的SqlSession实例(真正实例DefaultSqlSession),为什么在spring配置文件中配置bean的时候是SqlSessionFactoryBean呢?
在这里插入图片描述
看上图,有configLocation(获取mybatis配置文件)、configuration(mybatis配置文件的存储数据结构)、mapperLocations(bean对象映射地址集)、dataSource(数据源)…好吧,至此我们也应该大致能猜出SqlSessionFactoryBean是干什么的了,就是将所有信息封装到一个类里,只要我们将这个类的成员信息赋上我们相匹配的值,直接用这个类就好了。
在这里sql插入图片描述

看吧看吧,这就是我们在spring的配置文件中配置的SqlSessionFactoryBean对象以及注入其成员变量

SqlSessionTemplate 实体类

在这里插入图片描述
相较于SqlSession,SqlSessionTemplate多了SqlSessionFactory,以及SqlSession的动态代理

在这里插入图片描述
经过上图,我们发现SqlSessionTemplate的构造函数,最终调用的都是同一个,以及对sqlSession以动态代理的方式创建;下图为SqlSessionTemplate对sqlSession接口的动态代理的代理实现类;

在这里插入图片描述

在这里插入图片描述

SqlSessionManager 实体类

在这里插入图片描述
同上。(将来补充SqlSessionManager与SqlSessionTemplate)

总结

  • SqlSession接口有DefaultSqlSession、SqlSessionTemplate、SqlSessionManager三个实现类,主要用来操作数据库执行我们自定义的sql语句
  • SqlSessionFactory接口有DefalutSqlSessionFactory、SqlSessionManager两个接口,以及可以通过SqlSessionFactoryBeanBuiler.buil方法获取SqlSessionFactory,但实际上new出来的也是DefalutSqlSessionFactory,帮助我们解决每次进行数据库操作都要创建一个SqlSession太过麻烦,可以使用工厂类进行创建
  • SqlSessionFactoryBean,封装了sql一些相关的对象,供我们使用


这篇关于2021-10-01 mybatis ---- SqlSession、SqlSessionFactory、SqlSessionFactoryBean之间的关系的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程