Mybatis源码学习笔记

Mybatis核心概念:

 

Configuration : 管理 mysql-config.xml 全局配置关系类

SqlSessionFactory: Session 管理工厂接口

Session:  SqlSession 是一个面向用户(程序员)的接口。SqlSession 中提供了很多操作数据库的方法

Executor :  执行器是一个接口(基本执行器、缓存执行器)。 作用:SqlSession 内部通过执行器操作数据库

MappedStatement: 底层封装对象 。作用:对操作数据库存储封装,包括 sql 语句、输入输出参数

StatementHandler :具体操作数据库相关的 handler 接口

ResultSetHandler :具体操作数据库返回结果的 handler 接口

 

Debug代码执行顺序:

入口代码:

    String resource = "mybatis-config.xml";//获取源配置文件InputStream inputStream = Resources.getResourceAsStream(resource);//获取sqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取sessionSqlSession sqlSession = sqlSessionFactory.openSession();//操作数据库User user = sqlSession.selectOne("com.jiagouedu.mybatis.UserMapper.selectUser", 1);

 1. 解析xml文件变成Configuration 返回SqlSessionFactory

org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)>org.apache.ibatis.builder.xml.XMLConfigBuilder 构造函数>org.apache.ibatis.builder.xml.XMLConfigBuilder.parse>org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration mybatis-config.xml内容>org.apache.ibatis.parsing.XPathParser.evaluate>org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement>org.apache.ibatis.session.SqlSessionFactoryBuilder.build(org.apache.ibatis.session.Configuration)>org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.DefaultSqlSessionFactory

2. 执行器进行初始化 SimpleExecutor拿到SqlSession

org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession()>org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource>org.apache.ibatis.transaction.TransactionFactory.newTransaction(javax.sql.DataSource, org.apache.ibatis.session.TransactionIsolationLevel, boolean)>org.apache.ibatis.session.Configuration.newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)>org.apache.ibatis.executor.SimpleExecutor>org.apache.ibatis.executor.CachingExecutor  一级缓存 自动>org.apache.ibatis.plugin.InterceptorChain.pluginAll 责任链模式拦截器

3.操作数据库

org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(java.lang.String, java.lang.Object)>org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(java.lang.String, java.lang.Object)>org.apache.ibatis.session.Configuration.getMappedStatement(java.lang.String)>org.apache.ibatis.executor.CachingExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler)>org.apache.ibatis.executor.CachingExecutor.createCacheKey 缓存的key>org.apache.ibatis.executor.CachingExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)>org.apache.ibatis.executor.BaseExecutor.queryFromDatabase>org.apache.ibatis.executor.BaseExecutor.doQuery>org.apache.ibatis.executor.statement.PreparedStatementHandler.query>org.apache.ibatis.executor.resultset.ResultSetHandler.handleResultSets>org.apache.ibatis.executor.resultset.DefaultResultSetHandler

 

 以下是代码执行流程图:

 seesion的获取:

Mapper对象的获取:

 

执行器Executor:

BaseExecutor用到的是规范的理念,使实现这个接口的类都按照这个规范去做对应的事情.

 

Mybatis中用到的设计模式:

1.sqlSessionFactory 工厂

2. build 建造者

3. getInstance ,Cache 单例

4. 委派 装饰

5.InterceptorChain 责任链

6 Proxy 代理

7. Execute Command 命令

8.doQuery 模板

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JQData数据提取及MySQL简单操作——基于Python

JQData平台真的挺不错,平台数据可以免费使用一年,满足绝大多数人需求,具体账号获取请自行百度哟~ 因需要高频数据而Wind也只给近三年,再要还得购,,机缘遇到这一平台,获得了账号试用很不错&#…

JVM模型学习笔记

JVM由三个主要的子系统构成 1. 运行时数据区(内存结构): 运行时数据区也是JVM的核心部分 内存数据区又分:堆、java栈、本地方法栈、程序计数器、方法区 1.1 本地方法栈(线程私有): 登记native方法,在Execution Eng…

tomcat 设置虚拟路径的4种方法

通常使用方法1或者方法2 方法1 (添加配置文件):推荐使用,不需要重启服务器 在Tomcat根目录下的/conf/Catalina/localhost/ 路径下新建一个filename.xml,并在该xml中编写语句 即可创建虚拟站点,虚拟站点名为…

sharding-sphere按月动态分表

公司有个记录表,每天有几百万的数据,所以我决定按月把他分下表。 用spring整合的。 首先,sharding-sphere不支持自动创建表,所以我提前创建了两年的表,命名规则 logicTableName _2019_06 以下是官方文档上面的分片…

大厂Java岗面试心得记录

最近裸辞,面了几家大厂,offer率高达100% 哈哈,然后发现选公司也是一件难事。 废话不多说,分享一下,我遇到的面试题,大概有以下这些: JVM: 1.JVM有哪些区域? 2.堆和栈分别说说内部东…

原生Js 两种方法实现页面关键字高亮显示

方法一 依靠正则表达式修改 1.获取obj的html 2.统一替换html标签 3.替换要修改的关键字 4.再把html标签修改回去 不足就是如果查找的关键字跟替换的标签一样就有冲突了 <!DOCTYPE HTML> <html lang"en"> <meta http-equiv"Content-Type" co…

SpringBoot启动报错java.nio.charset.MalformedInputException: Input length = 2解决方案

最近新搭的一个项目&#xff0c;启动时&#xff0c;会报MalformedInputException这个异常&#xff0c; 百度了很久&#xff0c;网上说的千篇一律&#xff0c; 有的说&#xff0c;把yml复制到txt再复制回来 有的说&#xff0c;设置eclipse的utf-8环境 这些根本没有根治这个问…

IDEA主题设置与eclipse代码风格一致

习惯了用eclipse的你&#xff0c;是不是转到用idea特别不习惯&#xff0c;没有关系&#xff0c; 我们可以把idea的代码风格改成eclipse的&#xff0c;快捷键也换成eclipse的。 下载这个jar包&#xff0c;导入settings文件即可 下载地址 : https://download.csdn.net/download…

浅谈分布式锁

概述 为了防止分布式系统中的多个进程之间相互干扰&#xff0c;我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。 为什么要使用分布式锁 成员变量 A 存在 JVM1、JVM2、JVM3 三个 JVM 内存中 成员变量 A 同时都会在 JVM …

[css] 说说sroll-snap-type属性的运用场景有哪些?相关联的属性还有哪些?

[css] 说说sroll-snap-type属性的运用场景有哪些&#xff1f;相关联的属性还有哪些&#xff1f; 使用 sroll-snap-type 优化滚动 根据 CSS Scroll Snap Module Level 1 规范&#xff0c;CSS 新增了一批能够控制滚动的属性&#xff0c;让滚动能够在仅仅通过 CSS 的控制下&#…

简单的一个月之设计实现内容1

需求:简单的新闻管理系统,实现简单的增删改查功能 1.数据库表的建立 ID非空,数据类型看着给 2.写实体(entity)News.java 要与数据库中的字段相对应,(id,optimistic我没写,问题不大)1 package com.pay.boss.entity; //封装好的entity包,直接引用2 3 import java.util.Date; …

分享一个有趣的网站“让我帮你百度一下“

如何解决同事的弱智问题&#xff0c;分享一个有趣的网站 日常工作中&#xff0c;总有些人会问你一些弱智的问题 你只需要三步就可以完美解决: 1.打开这个链接: 让我帮你百度一下 2.输入他的问题、点回车 3.复制结果链接甩到他的脸上_ hahahhahahaha 这样就解决了一切烦恼&a…

SQL Server2014 SP2新增的数据库克隆功能

SQL Server2014 SP2新增的数据库克隆功能 原文:SQL Server2014 SP2新增的数据库克隆功能SQL Server2014 SP2新增的数据库克隆功能 创建测试库 --创建测试数据库 create database testtestuse testtest go --创建表 create table testtest(id int ,name varchar(20)) --插入数据…

工作328:uni-两个页面对象传递

getDetailList(record){console.log(record)uni.navigateTo({url:../formdaliyList/formdaliyList?recordencodeURIComponent(JSON.stringify(record))})},onLoad(e){/* JSON.parse() */let obj JSON.parse(decodeURIComponent(e.record));console.log(obj)},

vue-js 特殊变量$event常识

背景 如果我们要阻止默认事件&#xff0c;在 chrome 等浏览器中&#xff0c;我们可能要写一个&#xff1a; event.preventDefault(); 而在 IE 中&#xff0c;我们则需要写&#xff1a; event.returnValue false; jquery &#xff0c;跨浏览器的实现&#xff0c;我们统一只…

七、线性表的链式存储结构

1、问题引入 开发数组类模板的原因在于&#xff1a;在创建基于顺序存储结构的线性表时&#xff0c;发现这样的线性表可能被误用&#xff0c;因为重载了数组访问操作符&#xff0c;使用时跟数组类似&#xff0c;但是线性表和数组有很大的区别&#xff0c;所以激发了新的需求&…

工作333:uni-增加添加成功提示

this.$u.api.getPartyAdd(this.form).then(res > {console.log(res)if(res.data.code200){/* uni.showLoading({title: 添加中}); */this.$refs.uToast.show({title: res.data.message,type: success,})setTimeout(function () {uni.navigateTo({url: "../notice_notic…

HDU 6064 RXD and numbers

传送门 有向图生成树计数 &#xff08;度数 ->入度->外向树&#xff09; BEST定理 &#xff08;不定起点的欧拉回路个数某点为根的外向树个数&#xff08;存在欧拉回路->每个点为根的外向树个数相等&#xff09;*&#xff08;每个点的度数&#xff08;存在欧拉回路-&g…

vue.js框架的生命周期:常用钩子函数

//组件实例化之前执行的函数 beforeCreate:function () { alert("组件实例化之前执行的函数") }, //组件实例化完毕执行的函数 created:function () { alert("组件实例化完毕执行的函数") }, //组件挂载前&#xff0c;页面仍未展示&#xff0c;但虚拟Dom已…

工作334:uni-控制整个label区域可选

<navigator url"../LevineHua-editor/LevineHua-editor" class"single"><u-form-item label"内容" label-width"100%" prop"content" class"label-left"><u-input placeholder"请输入公告内容…