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是干什么的了,就是将所有信息封装到一个类里,只要我们将这个类的成员信息赋上我们相匹配的值,直接用这个类就好了。
看吧看吧,这就是我们在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之间的关系的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享