深度解析

Mybatis3.3.x技术内幕(三):Mybatis事务管理(将颠覆你心中目前对事务的理解)

那年仲夏 提交于 2020-03-20 20:53:40
3 月,跳不动了?>>> 1.说到数据库事务,人们脑海里自然不自然的就会浮现出事务的四大特性、四大隔离级别、七大传播特性。四大还好说,问题是七大传播特性是哪儿来的?是Spring在当前线程内,处理多个数据库操作方法事务时所做的一种事务应用策略。事务本身并不存在什么传播特性,不要混淆事务本身和Spring的事务应用策略。(当然,找工作面试时,还是可以巧妙的描述传播特性的) 2.一说到事务,人们可能又会想起create、begin、commit、rollback、close、suspend。可实际上,只有commit、rollback是实际存在的,剩下的create、begin、close、suspend都是虚幻的,是业务层或数据库底层应用语意,而非JDBC事务的真实命令。 create(事务创建):不存在。 begin(事务开始):姑且认为存在于DB的命令行中,比如Mysql的start transaction命令,以及其他数据库中的begin transaction命令。JDBC中不存在。 close(事务关闭):不存在。应用程序接口中的close()方法,是为了把connection放回数据库连接池中,供下一次使用,与事务毫无关系。 suspend(事务挂起):不存在。Spring中事务挂起的含义是,需要新事务时,将现有的connection1保存起来(它还有尚未提交的事务)

Mybatis3.3.x技术内幕(九):Mybatis初始化流程(中)

ぐ巨炮叔叔 提交于 2019-11-28 12:56:14
Mybatis初始化流程,其实就是组装重量级All-In-One对象Configuration的过程,主要分为系统环境参数初始化和Mapper映射初始化。 上一节中,粗略讲述了 Mybatis初始化的基本步骤,本节,将详细分析具体的初始化过程中的细节问题,细节决定成败。 1. Properties variables的作用 通常,我们会单独配置jdbc.properties文件,保存于 variables变量中, 而Xml文件内可以使用${driver}占位符,读取时可动态替换占位符的值。 String value = PropertyParser.parse(attribute.getNodeValue(), variables); Mybatis中的PropertyParser类,就是用来动态替换占位符参数的。 2. 扫描package <typeAliases> <typeAlias alias="Student" type="com.mybatis3.domain.Student" /> <typeAlias alias="Teacher" type="com.mybatis3.domain.Teacher" /> <package name="com.mybatis3.domain" /> </typeAliases> 前两个typeAlias,很容易理解,那么

Mybatis3.3.x技术内幕(七):Mybatis初始化之六个工具

喜夏-厌秋 提交于 2019-11-28 12:56:01
全民欢庆的五一劳动节,可谓是赏花赏月赏秋香的好季节,炎炎夏日,柳絮飞扬,短裙飞舞,低胸抢镜,是旅游撩妹裸奔等精彩活动的不二选择,不过,这显然与我无关。 终于要开启Mybatis的初始化过程分析了,是不是等的花儿都要开放了呢? 一般的框架分析思路都是从启动、初始化说起,然而,由于没有心理准备,初始化过程中会瞬间涌入大量的概念、类等等,类之间又存在爆炸性延伸,反而吓退了读者,有种吃不下这块肥肉的感觉。所以,我选择优先介绍一些易于理解的框架概念,然后再阅读和分析框架的启动和初始化流程,有了事先的精心准备,肥肉也就不再肥了。 我一直在反思,我的博文是否写的过长了,读者是否读的很累,是否没有描述清楚内容,是否没有抓住重点。因此,我大胆创新了博文的写作模式,叫 精炼博文 。 Mybatis的初始化过程,就是组装Configuration的过程,在这个过程中,用到了一些工具,我列举了六个基本工具,如图所示。 (Made In Edrawmax) 图中展示了XMLConfigBuilder为了组装出Configuration对象所作出的努力,配备了至少六个基本工具。本文的重点,就是分析这六个工具的作用。 好怕怕啊,一下子分析六个那么多。别怕,每个工具不超过三行代码,你就会彻底明白(相信你自己)。 1. ObjectFactory ObjectFactory objectFactory = new

Mybatis3.3.x技术内幕(二):动态代理之投鞭断流(自动映射器Mapper的底层实现原理)

天涯浪子 提交于 2019-11-28 10:21:22
一日小区漫步, 我问朋友:Mybatis中声明一个interface接口,没有编写任何实现类,Mybatis就能返回接口实例,并调用接口方法返回数据库数据,你知道为什么不?朋友很是诧异:是啊,我也很纳闷,我们领导告诉我们按照这个模式编写就好了,我同事也感觉很奇怪,虽然我不知道具体是怎么实现的,但我觉得肯定是……(此处略去若干的漫天猜想),但是也不对啊,难道是……(再次略去若干似懂非懂)。 这激发了我写本篇文章的冲动。 动态代理的功能:通过拦截器方法回调,对目标target方法进行增强。 言外之意就是为了增强目标target方法。上面这句话没错,但也不要认为它就是真理,殊不知,动态代理还有 投鞭断流 的霸权,连目标target都不要的科幻模式。 注:本文默认认为,读者对动态代理的原理是理解的,如果不明白target的含义,难以看懂本篇文章,建议先理解动态代理。 1. 自定义JDK动态代理之 投鞭断流 实现自动映射器Mapper 首先定义一个pojo。 public class User { private Integer id; private String name; private int age; public User(Integer id, String name, int age) { this.id = id; this.name = name; this.age =

Mybatis3.3.x技术内幕(八):Mybatis初始化流程(上)

坚强是说给别人听的谎言 提交于 2019-11-27 08:35:02
Mybatis初始化流程,其实就是组装重量级All-In-One对象Configuration的过程,主要分为系统环境参数初始化和Mapper映射初始化,其中Mapper映射初始化尤为重要。 inputStream = Resources.getResourceAsStream("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); return new DefaultSqlSessionFactory(parser.parse()); } parser.parse()方法,已经返回了组装完毕的 Configuration对象。 流程进入XMLConfigBuilder.parse()方法。 public Configuration parse() {

Mybatis3.3.x技术内幕(六):StatementHandler(Box stop here)

倖福魔咒の 提交于 2019-11-26 20:36:04
神通广大的猴哥SqlSession,把琐事委托给二弟Executor来处理,二弟Executor可不那么傻,于是它又把事情委托给三弟StatementHandler,三弟憨厚老实,本着 Box stop here 的精神,无怨无悔不说,还任劳任怨,于是,一代伟人就此诞生了。 三弟 StatementHandler从跑龙套开始,逐渐崛起,先后担任武术指导、制片、监制等职位,最后,经验丰富的它当上了导演,拍了属于自己的作品:三弟电影,又称3D电影。 有关 Box stop here 的故事,请自行了解。 1. 数据库操作invoke时序图 (Made In Visual Paradigm) 本文重点分析StatementHandler和ParameterHandler是如何与Executor共襄盛举的。( 上图中的execute()失误画错了,应该是executeQuery() ) 2. Executor内使用 StatementHandler模板 Statement stmt; StatementHandler handler; // 判断缓存内是否存在stmt if (...) { // 不存在,就创建一个Statement(可能是Statement、PrepareStatement、CallableStatement) stmt = handler.prepare

Mybatis3.3.x技术内幕(一):SqlSession和SqlSessionFactory列传

旧巷老猫 提交于 2019-11-26 20:35:48
前言:我长大了,成年了,有需求,但我单身,所以我要讨个媳妇,要求是:漂亮、高挑、身材好、笑容甜美…… 和A相亲:漂亮,不够高挑。 和B相亲:高挑,身材不够好。 和C相亲:身材好,笑容不够甜美。 …… 好烦,没有符合要求的,我是一个痛苦的完美主义者,我怒了,我决定依照完美的幻想,自己造一个。但不知道我的决定是对是错,请佛指点,佛面带慈祥的微笑,曰:你不造一个,谁造一个? 于是,造之前,我给她取了一个清新典雅的名字: Mybatis3.3.x技术内幕 。 wocao,好耳熟的名字,好像在哪儿听过。 以上便是面对已有的那么多有关Mybatis源码分析的文章,而我为什么决定新造一个“ 东风铁甲 ”的故事。 一部经典的《Mybatis3.3.x技术内幕》,就从SqlSession和SqlSessionFactory说起。 ‍ 1. SqlSession和 SqlSessionFactory的接口定义 ‍ 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