源码分析

mybatis源码分析之SqlSession的创建过程

旧城冷巷雨未停 提交于 2019-11-26 20:54:56
mybatis之SqlSessionFactory mybatis源码分析之Configuration mybatis源码分析之事务管理器 以上是之前的分析,在 mybatis源码分析之事务管理器 里分析到了事务管理器 SqlSession session = sqlSessionFactory.openSession(); //DefaultSqlSessionFactory里的openSession public SqlSession openSession() { return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false); } private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; try { //根据配置获取环境 final Environment environment = configuration.getEnvironment(); //构建事务工厂 final TransactionFactory

Mybatis3.3.x技术内幕(十四):Mybatis之KeyGenerator

非 Y 不嫁゛ 提交于 2019-11-26 20:36:20
在Mybatis中,执行insert操作时,如果我们希望返回数据库生成的自增主键值,那么就需要使用到KeyGenerator对象。 需要注意的是,KeyGenerator的作用,是返回数据库生成的自增主键值,而不是生成数据库的自增主键值。返回的主键值放到哪儿呢?放到parameter object的主键属性上。 下面看看其接口定义。 public interface KeyGenerator { void processBefore(Executor executor, MappedStatement ms, Statement stmt, Object parameter); void processAfter(Executor executor, MappedStatement ms, Statement stmt, Object parameter); } 接口定义还是比较简单的,就是在insert前、insert后,策略处理主键值。 (Made In IntelliJ IDEA IDE) Jdbc3KeyGenerator:用于处理数据库支持自增主键的情况,如MySQL的auto_increment。 NoKeyGenerator:空实现,不需要处理主键。 SelectKeyGenerator:用于处理数据库不支持自增主键的情况,比如Oracle的sequence序列。

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

Mybatis3.3.x技术内幕(五):Executor之doFlushStatements()

我们两清 提交于 2019-11-26 20:35:08
这天气,热的我满头大蒜。 在上一篇博文 ‍ ‍ ‍ ‍ 《五鼠闹东京之执行器Executor设计原本》 ‍ ‍ ‍ ‍ 中,已经对 Executor做了比较详细的分析,但是,测试妹纸阅读完后,表示某些地方看不懂,毫不客气的给我提出了两点修改意见。 一、看完你的Statement和PrepareStatement批处理原理图,依然不明白为何一个编译Sql 3次,而另外一个编译Sql 1次。 二、对关闭Statement对象一笔带过,不够清晰。 我准备亡羊补牢,针对上面的两个问题进行补充完善。 1.Statement和PrepareStatement在批处理时对Sql的编译策略 insert into students(id) values(1); insert into students(id) values(1); insert into students(id) values(2); insert into students(id) values(3); 上面的4个Sql,无论是Statement,还是PrepareStatement,对Sql都编译3次。因为其中第1、2条Sql是完全相同的,只会编译1次。 insert into students(id) values(?); // id=[1,2,3] 对于 PrepareStatement,支持问号“?”占位符

mybatis源码分析之事务管理器

ⅰ亾dé卋堺 提交于 2019-11-26 11:37:11
上一篇: mybatis源码分析之Configuration 主要分析了构建SqlSessionFactory的过程中配置文件的读取. 这次重点分析mybatis的事务管理器 仍旧从官网给的例子着手分析,配置文件mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/

Mybatis3.3.x技术内幕(四):五鼠闹东京之执行器Executor设计原本

孤街醉人 提交于 2019-11-26 11:24:34
在上一篇博文中,已经分析了Mybatis事务相关的内容,而今天的这篇博文,很多内容都是在方法method内部,与事务无关,所以,建议暂时忘记事务概念,避免搅扰。 Mybatis对数据库的操作,都将委托给执行器Executor来完成,所以,在Mybatis这部电影当中,Executor是绝对的领衔主演。 在Mybatis中,SqlSession对数据库的操作,将委托给执行器Executor来完成,而Executor由五鼠组成,分别是: 简单鼠SimpleExecutor 、 重用鼠ReuseExecutor 、 批量鼠BatchExecutor 、 缓存鼠CachingExecutor 、 无用鼠ClosedExecutor 。 ‍ 1. Executor接口设计与类结构图 ‍ public interface Executor { ResultHandler NO_RESULT_HANDLER = null; int update(MappedStatement ms, Object parameter) throws SQLException; <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey