mybatis plus 批量保存_mybatis源码分析

原理图:

64e2da085b9b5748544db8592157870d.png

Configuration解析:

Configuration表示配置,该对象中维护了很多mybatis的配置参数;

大致可分为四部分:1.环境变量Environment 2.配置参数;3.缓存集合;4.插件及其他

1.1环境变量Environment

ce442b386b8d3cf03819f13e6bfb859f.png

Environment.java源码

通过Environment源码可以看出,Environment仅维护了一个id 唯一标识,TransactionFactory(事物工厂,负责事物管理,Mybatis提供了两套事物管理

1.org.apache.ibatis.transaction.jdbc 基于jdbc实现事物管理;

2.org.apache.ibatis.transaction.managed 用于扩展第三方事物管理);

和DataSource(数据源)。

1.2配置参数:

Configuration提供了一些默认配置参数,并可通过get/set方法修改参数值;

1.3缓存集合:

Configuration维护了很多缓存容器,如caches,resulrtMaps等’

Configuration初始化

1.api构建;2.xml初始化

9948cf08fcc6c9686288ef614ced6176.png

Configuration初始化

MappendStatement解析:

该对象是mapper.xml在对象中的体现,是整个mybatis框架中最为核心的对象,我们也可以不必通过xml文件来构建该对象,可以直接通过编码方式构建,像最常用的简单的增删改查操作完全可以手动构建mappedStatement对象并加入到mybatis容器中,这样我们就不需要在xml文件中手写CRUD操作了,mybatis-plus框架设计的思想就是鉴于此。

public final class MappedStatement { private String resource; private Configuration configuration; //sql的ID private String id; //尝试影响驱动程序每次批量返回的结果行数和这个设置值相等 private Integer fetchSize; //SQL超时时间 private Integer timeout; //Statement的类型,STATEMENT/PREPARE/CALLABLE private StatementType statementType; //结果集类型,FORWARD_ONLY/SCROLL_SENSITIVE/SCROLL_INSENSITIVE  private ResultSetType resultSetType; //表示解析出来的SQL private SqlSource sqlSource; //缓存 private Cache cache; //已废弃 private ParameterMap parameterMap; //对应的ResultMap private List resultMaps; private boolean flushCacheRequired; private boolean useCache; private boolean resultOrdered; //SQL类型,INSERT/SELECT/DELETE private SqlCommandType sqlCommandType; //和SELECTKEY标签有关 private KeyGenerator keyGenerator; private String[] keyProperties; private String[] keyColumns; private boolean hasNestedResultMaps; //数据库ID,用来区分不同环境 private String databaseId; private Log statementLog; private LanguageDriver lang; //多结果集时 private String[] resultSets; ...}

源码分析:

1.SqlSessionFactory 装配Configuration对象;

2.将配置文件中的mapers注册到configuration的mapperRegistry中

71d2365f463244ce7ab894b23325f74c.png

Mybatis代理模式原理分析:

4e4f8d127af234986ba8d33cc4c7cc01.png
febfb85b0b66a4b7902baee722dabf14.png
01497057da86e8400e00ca33b0044c7d.png
buildSqlSessionFactory方法:XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(mapperLocation.getInputStream(), configuration, mapperLocation.toString(), configuration.getSqlFragments());xmlMapperBuilder.parse();

SqlSession提供select/insert/update/delete方法,在旧版本中使用使用SqlSession接口的这些方法,但是新版的Mybatis中就会建议使用Mapper接口的方法。

射器其实就是一个动态代理对象,进入到MapperMethod的execute方法就能简单找到SqlSession的删除、更新、查询、选择方法,从底层实现来说:通过动态代理技术,让接口跑起来,之后采用命令模式,最后还是采用了SqlSession的接口方法(getMapper()方法等到Mapper)执行SQL查询(也就是说Mapper接口方法的实现底层还是采用SqlSession接口方法实现的)。

解析XMLStatementBuilder.java:

将xml文件转换成MappedStatement对象

public void parseStatementNode() {

String id = context.getStringAttribute("id");

String databaseId = context.getStringAttribute("databaseId");

if (!databaseIdMatchesCurrent(id, databaseId, this.requiredDatabaseId)) {

return;

}

Integer fetchSize = context.getIntAttribute("fetchSize");

Integer timeout = context.getIntAttribute("timeout");

String parameterMap = context.getStringAttribute("parameterMap");

String parameterType = context.getStringAttribute("parameterType");

Class> parameterTypeClass = resolveClass(parameterType);

String resultMap = context.getStringAttribute("resultMap");

String resultType = context.getStringAttribute("resultType");

String lang = context.getStringAttribute("lang");

LanguageDriver langDriver = getLanguageDriver(lang);

Class> resultTypeClass = resolveClass(resultType);

String resultSetType = context.getStringAttribute("resultSetType");

StatementType statementType = StatementType.valueOf(context.getStringAttribute("statementType

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

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

相关文章

判断领导是在压榨你,还是在培养你?就看这5点!别被骗了!

职场&认知洞察 丨 作者 / findyi这是findyi公众号分享的第102篇原创文章前文写了职场PUA的文章,有读者问洋哥:我的领导有点像PUA,但又总是说要培养我,怎么破?读者问的问题并不是个案,前不久一个哥们挺郁…

java使用教程——组件及事件处理——窗口(设置窗口的颜色和背景)

用JFrame时,设置背景颜色需使用JFrame.getContentPane().setBackground(Color.red) Container conthis.getContentPane();//得到内容窗格 con.setBackground(Color.blue); 而使用Frame时则可以直接使用setBackground(Color.red),且需要设置窗体默认关闭事…

python调用libvirt_通过python获取kvm虚拟机的监控信息(基于libvirt API)

通常在我们的云环境中,为了保证云平台中虚拟机的正常运行,基本都需要这样一个功能,就是收集虚拟机的监控数据,比如cpu的使用率、内存的使用率、磁盘io、网络io等基本信息。可以利用这些信息及时调整云平台环境中出现的一些问题&am…

揭秘软件开发的达摩克利斯之剑

↑ ???? 万字长文不想看,那就听一听叭 ↑为什么你的程序总是出现 bug?凭什么让改 bug 占据了你大部分的时间?看完本文,保证你能设计出更稳定的程序,摆脱 bug 的缠绕,做项目更安心!记得我在学…

python 百度ai批量识别_Python基于百度AI的文字识别的示例

Python基于百度AI的文字识别的示例使用百度AI的文字识别库,做出的调用示例,其中filePath是图片的路径,可以自行传入一张带有文字的图片,进行识别。下载baidu-aip这个库,可以直接使用pip下载:pip install ba…

java使用教程——组件及事件处理——菜单(添加图标)

菜单条JMenuBar 菜单JMenu 菜单项JMenuItem menuFruit.addSeparator(); //在菜单添加分隔线 public class Example9_2 {public static void main(String args[]) {WindowMenu winnew WindowMenu("带菜单的窗口",20,30,600,290);} }C:/Users/86156/OneDrive/图片/水…

java使用教程——组件及事件处理——常用组件与布局

常用组件: 1.JTextField(文本框) 允许用户在文本框中输入单行文本 2.JTextArea(文本区) 允许用户文本区中输入多行文本 3.JLabel(标签) 标签为用户提供信息 4.JButton(按钮) 允许用户单击按钮 5.JCheckBox(复选框) 为用户提供多种选择 6.JComboBox(下拉列表&#xf…

数据库大战,AWS又将目标瞄准了微软SQL Server

喜欢就关注我们吧!文|白开水AWS 宣布了一种新的数据库产品 — 用于 Aurora PostgreSQL 的 Babelfish。该产品旨在效仿 Microsoft 的 SQL Server,并吸引 SQL Server 用户迁移到 AWS 云平台。图片来源:techcrunchAWS 首席执行官 Andy Jassy 在 …

python3九九乘法表儿歌下载_python3的基础学习之九九乘法表和format函数,值得收藏...

1. 九九乘法表1.1 代码一for i in range(1, 10): #range取值1,2,3,4,5,6,7,8,9;做i的值,到10停止,不取10for j in range(1, i 1): #range取值,1,2,3,4,5,6,7,8,9,当i9时,到i910停止,不取10prin…

java实用教程——组件及事件处理——处理事件

事件处理模式: 1.事件源; 能够产生事件的对象都可以称为事件源 2监视器; 需要一个对象对事件进行监视,以便对发生的事件做出处理 3处理事件的接口 监视器负责处理事件源发生的事件,为了让监视器这个对象能够对事件源发…

python opencv 图像添加噪声_opencv+python同时加椒盐噪声和随机杂点噪声

同时生成椒盐代码如下:通过pertotal 设置噪声总数 persalt盐噪声比例#同时加椒盐 总占比 pertotal ,persalt盐占比image cv.imread(c:\\meiping1.png)height image.shape[0]width image.shape[1]channels image.shape[2]pertotal 0.03 #总噪声占比…

惊!Kubernetes 将弃用 Docker,开发者们怎么办?

喜欢就关注我们吧!文|大东BE近日,Kubernetes 官方发布公告,宣布自 v1.20 起放弃对 Docker 的支持,届时用户将收到 Docker 弃用警告,并需要改用其他容器运行时。但 Docker 作为容器镜像构建工具的作用将不受影响&#x…

sql计算留存_SQL基础第七讲:关于用户留存率的计算

最近,好几个小伙伴都拿着关于用户留存的面试题来问我,所以今天单独开一篇文章讲一下留存问题。首先看一下留存是什么,简单来说,我和你今天在一家超市购物了,明天我来购物了,你没来,那么我就是这…

java实用教程——组件及事件处理——ActionEvent事件

事件源: 文本框,按钮,菜单项,密码框,单选按钮 注册监视器: 能够触发ActionEvent事件的组件使用方法 addActionListener(ActionListener listener) 处理事件接口: ActionListener接口中只有一个方…

【Azure Show】|第七期 特别版线上沙龙直播回顾. 嘉宾张坤段清华谭国欣柯克黄炜锵...

我是MVP 继与广州图书馆合作推出【搭上AI快车】在线公益课堂和大家分享了基于移动应用的人工智能开发经验后,本期继续与广州图书馆合作,邀请更多的微软技术专家,推出我们Azure Show节目的特别版,为大家带来各IT技术领域的经验分享…

java实用教程——组件及事件处理——ItemEvent事件(设置字体类型)

ItemEvent事件源: 选择框,下拉列表都可以触发ItemEvent事件 注册监视器: 能够触发ItemEvent事件的组件使用addItemListener(ItemListener listen) 将实现ItemListener的接口的类的实例注册为事件源的监视器 ItemListener接口: 接口…

python开发一个自己的技术网站_手把手教你写网站:Python WEB开发技术实战

摘要:本文详细介绍了Python WEB开发的基础入门。以一个博客站点的开发为例讲解了基于Django框架开发WEB站点的全过程。通过本文的学习可以快速掌握基于Django的Python WEB的开发方法,进行WEB站点的实践开发。数十款阿里云产品限时折扣中,赶紧…

理解 redis 中的 哈希对象类型

redis中的hash也是我们使用中的高频数据结构,它的构造基本上和编程语言中的HashTable,Dictionary大同小异,如果大家往后有什么逻辑需要用Dictionary存放的话,可以根据场景优先考虑下redis哦,起码可以装装嘛&#xff0c…

java实用教程——组件及事件处理——DocumentEvent事件

DocumentEvent事件源: 文本区Document的维护 注册监视器: 使用addDocumentListener(DocumentListener listen)为事件源添加监视器 DocumentListener接口: 接口中有三个方法: public void changUpdate(DocumentEvent e); public vo…

python递归函数查询表_python---------------递归函数

一、递归的定义1.什么是递归:在一个函数里在调用这个函数本身2.最大递归层数做了一个限制:997,但是也可以自己限制1 deffoo():2 print(n)3 n14 foo(n)5 foo(1)3.最大层数限制是python默认的,可以做修改,但是不建议你修…