MyBatis 之 SqlSessionManager 源码分析
MyBatis 的 4 个基本构成:
SqlSessionFactoryBuilder(构造器):
根据配置信息或者代码来生成 SqlSessionFactory(工厂接口)
SqlSessionFactory:
依靠工厂来生成 SqlSession(会话),每个 MyBatis 的应用都是以 SqlSessionFactory 的实例为中心的。SqlSessionFactory 通过 SqlSessionFactoryBuilder 获得。MyBatis 提供了两个 SqlSessionFactory 的实现类,DefaultSqlSessionFactory 和 SqlSessionManager,Mybatis 使用的是前者,不过本篇的主角是 SqlSessionManager
SqlSession:
是一个既可以发送 SQL 去执行并返回结果,也可以获取 Mapper 的接口。SqlSession 类似于一个 JDBC 的 Connection 对象。
SQL Mapper:
它是 MyBatis 新设计的组件,它是由一个 Java 接口和 XML 文件(或注解)构成的,需要给出对应的 SQL 和映射规则。它负责发送 SQL 去执行,并返回结果
SqlSessionManager 分析:
实现 SqlSessionFactory、SqlSession 两个接口
SqlSessionFactory 接口中方法包括
- openSession()
- ...
SqlSession 接口中方法包括,对数据的各种操作:
- selectOne()
- selectList()
- update()
- insert()
- ...
类属性:
- SqlSessionFactory SqlSessionFactory:用于在 openSession 方法中创建 SqlSession
- SqlSession sqlSessionProxy:用于与 mapper 交互,注意其属性名带有 Proxy,所以它是通过反射创建的
- ThreadLocal<SqlSession>:用于用户自己控制 SqlSession 时使用,通过 SqlSessionFactory 工厂创建
构造方法:
私有构造方法:
入参为 SqlSessionFactory,其中 sqlSessionProxy 通过 JDK 提供的动态代理实现,
Proxy.newProxyInstance() 入参说明:
- loader:定义代理类的类加载器
- interfaces:代理类要实现的接口列表
- h:指派方法调用的调用处理程序
Proxy.newProxyInstance() 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
newInstance 方法:
构建模式,通过该方法来调用构造方法,来初始化 sqlSessionFactory 和 sqlSessionProxy
startManagedSession 方法:
初始化 localSqlSession 属性,通过 sqlSessionFactory.openSession()获得 SqlSession,再将其 set 到 localSqlSession 中
openSession 方法:
该方法来自 SqlSessionFactory 接口的方法列表,通过 sqlSessionFactory.openSession()来获得 SqlSession,openSession 由 DefaultSqlSessionFactory 实现
余下的方法都是 SqlSession 接口的方法实现:
由 sqlSessionProxy 这个 SqlSession 代理对象来执行
内部类 SqlSessionInterceptor:
实现 InvocationHandler 接口,当执行 SqlSession 接口的方式实现时,就会进入这个代理方法中。
可以看到 SqlSession 通过 openSession 方法获得,此处的 sqlSession 实例便是 SqlSession 的代理对象 SqlSessionProxy,之后执行 commit 操作,注意这里使用了 try catch 块,在 finally 中执行 SqlSession 的 close 方法,这使得开发者不必再在代码中去手动 close

参考资料
[1] mybatis 3.4.2 DefaultSqlSessionFactory的优化版SqlSessionManager
[2] MyBatis中SqlSessionManager设计疑问
[3] mybatis源码分析(3)——SqlSessionManager类
MyBatis 之 SqlSessionManager 源码分析的更多相关文章
- Springboot中mybatis执行逻辑源码分析
Springboot中mybatis执行逻辑源码分析 在上一篇springboot整合mybatis源码分析已经讲了我们的Mapper接口,userMapper是通过MapperProxy实现的一个动 ...
- MyBatis架构与源码分析<资料收集>
1.架构与源码分析 :https://www.cnblogs.com/luoxn28/p/6417892.html .https://www.cnblogs.com/wangdaijun/p/5296 ...
- mybatis 学习四 源码分析 mybatis如何执行的一条sql
总体三部分,创建sessionfactory,创建session,执行sql获取结果 1,创建sessionfactory 这里其实主要做的事情就是将xml的所有配置信息转换成一个Confi ...
- Mybatis原理及源码分析
什么是Mybatis? Mybatis是一个半自动化的持久层框架. Mybatis可以将向PreparedStatement中的输入参数自动进行映射(输入映射),将结果集映射成Java对象(输出映射) ...
- Mybatis源码学习第七天(插件源码分析)
为了不把开发和源码分析混淆,决定分开写; 接下来分析一下插件的源码,说道这里老套路先说一个设计模式,他就是责任链模式 责任链模式:就是把一件工作分别经过链上的各个节点,让这些节点依次处理这个工作,和装 ...
- spring security 实践 + 源码分析
前言 本文将从示例.原理.应用3个方面介绍 spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 Spring Security 是 ...
- Mybatis Mapper接口是如何找到实现类的-源码分析
KeyWords: Mybatis 原理,源码,Mybatis Mapper 接口实现类,代理模式,动态代理,Java动态代理,Proxy.newProxyInstance,Mapper 映射,Map ...
- 精尽MyBatis源码分析 - MyBatis-Spring 源码分析
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- MyBatis源码分析-MyBatis初始化流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
随机推荐
- OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数
凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...
- Oracle 12C -- 统一启动/关闭PDBs
SQL> select name,open_mode from v$pdbs; NAME OPEN_MODE ------------------------------ ---------- ...
- 从语句 char* p="test" 说起
我相信,使用C/C++多年的人对下面这个字符串赋值语句都不会陌生吧. char* p = "test"; 同时,我也相信,各位在使用这种语句后吃 ...
- 还没被玩坏的robobrowser(3)——简单的spider
背景 做一个简单的spider用来获取python selenium实战教程的一些基本信息.因为python selenium每年滚动开课,所以做这样一个爬虫随时更新最新的开课信息是很有必要的. 预备 ...
- 构建基于阿里云OSS文件上传服务
转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50710132 <构建基于阿里云OSS文件上传服务> <构建基于OS ...
- matlab中的Traing、Validation、Testing
<matlab神经网络30个案例分析> ROC曲线是反映敏感性和特异性连续变量的综合指标,roc曲线真阳性率为纵坐标,假阳性率为横坐标,在坐标上由无数个临界值求出的无数对真阳性率和假阳性率 ...
- Package CJK Error: Invalid character code. 问题解决方法--xelatex和pdflatex编译的转换
Package CJK Error: Invalid character code. 问题解决方法--xelatex和pdflatex编译的转换 解决方法:添加格式说明信息 将下面语句: \docum ...
- ACM会议列表与介绍(2014/05/06)
Conferences ACM SEACM Southeast Regional Conference ACM Southeast Regional Conference the oldest, co ...
- JDK1.5新特性,基础类库篇,浅谈并发工具包(Concurrency Utilities)
java.util.concurrent, java.util.concurrent.atomic, 和 java.util.concurrent.locks 包提供了高性能的.可扩展的框架,保证开发 ...
- 利用阿里云如何开发一款直播app?
在开发的过程中应该注意些什么?下面让小编告诉你: 随着互联网的发展,越来越多的人已经加入互联网的行列.而且很多的人也开始直播,和众多的网友分享自己身边事情.互联网还在加速发展,从PC互联网,到移动互联 ...