最新阿昌教你看懂mybatisplus的sql执行流程(1),java内存模型面试题

总结

三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。

  • 第一个是算法

关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。

而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本

《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

《算法的乐趣》共有23个章节:

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)

基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

首先,我们知道项目启动后,SpringBoot会装配对应的mapper接口文件和.xml文件到mybatis的configurationmappedStatements中。里面有对应sql的全部内容,包括完整语句,拆分拼接语句等的内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rffsmEte-1637916210359)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126115153276.png)]

在开始之前,mybatis的sql执行流程中必然会涉及到代理设计模式,具体的内容可以参考《代理模式


正文


我们调用selectCount()方法,查询数据库的时候。

他会执行这个方法对应的代理对象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E13znZ7P-1637916210361)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126132136996.png)]

他所对应的代理对象执行的类PageMapperProxy

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDQ7E3Mp-1637916210363)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126132313039.png)]

因为他实现了InvocationHandler,所以他需要重写了invoke()方法

  • 上来先判断他是否是Object类本身,如果是就不增强

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jBqBiRoo-1637916210364)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126133234447.png)]

  • 判断缓存中是否有对应方法的缓存,如果缓存中没有,则创建一个,并添加到缓存中

[外上传(imaming\Typora\typora-user-images\image-20211126133604760.png)]

  • 调用mapperMethod.execute方法执行sql

在这里插入图片描述


判断对应的sql执行类型

  • 首先上来会判断此次执行的sql是什么类型的操作

在这里插入图片描述

  • 这次我们执行的操作是Select操作,他细分了具体的内容,如是否有返回值/多个/map/标记等的具体划分

在这里插入图片描述

  • 这次的查询都不符合,我们查询的是count数量,所以最后返回的是一个值,就执行else里面的convertArgsToSqlCommandParam

  • 一看方法名都能猜的出来,就是把对应的sql和我们的传入的参数做整合在一起

在这里插入图片描述

command.getName()获取到需要执行方法的全限定名

在这里插入图片描述

param对应传入的参数

  • sqlSession.selectOne(command.getName(), param)这个方法又被代理

在这里插入图片描述

  • 执行的AOP前后额外内容的结构如下:↓

在这里插入图片描述


获取对应sqlSession会话

  • 他在前置执行获取了对应的sqlSession,在里面执行了对应的操作,并执行openSession(),打开获取这次会话

在这里插入图片描述

  • 注意,这里的autoCommit为false,不自动提交会话

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CM8IHuQp-1637916210374)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126141951653.png)]

  • 根据对应的设置构造一个DefaultSqlSession对象返回

在这里插入图片描述

  • 返回sqlSession

在这里插入图片描述


  • 发现method.invoke(sqlSession, args),它又又又被代理了 3次!!!

在这里插入图片描述


selectList

  • 最后,他执行selectList()

在这里插入图片描述

  • 我们会发现,上面我们是查询一个返回对象,但是最后还是执行的selectList()方法。

  • 但是,他会在下面对个数进行判断,如果是一个拿到集合第一个返回,如果多个就报TooManyResultsException错误,不然就返回null

在这里插入图片描述

  • 他封装了两层的selectList(),传入的statement就是方法的全限定名,parameter顾名思义就是这次查询的参数

在这里插入图片描述

  • 最最最最最最最最最!!!!关键的一步骤。

在这里插入图片描述

  • MappedStatement你还熟悉吗???configuration.getMappedStatement(statement)

  • 他根据方法的全限定名来拿到已经拼接好的sql语句

在这里插入图片描述

  • 拿到的这个ms,就是这个方法对应的sql语句

MappedStatement ms = configuration.getMappedStatement(statement);

  • 然后用执行executor

executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);

  • 但是发现,它又被代理了一层

在这里插入图片描述


Plugin资料

  • 这个叫Plugin的类是啥,我们看名字可以看出是插件

  • 这个Plugin类的mybatis提供第三方进行拦截的插件类,加上插件就是通过这个类的wrap()方法

在这里插入图片描述

  • 比如PageHelper分页插件,他就会有个PageInterceptor

在这里插入图片描述


  • 这里就是自定义的拦截器第三方插件了,他就循环遍历。

在这里插入图片描述

  • 比如阿昌这里装了PageHelper,那这里就会执行PageHelper的拦截器PageInterceptorintercept方法

在这里插入图片描述

  • 因为这里,我们并没有使用PageHelper的分页方法,所以就不会执行,会被放行,他会根据对应参数个数,来生产对应的CacheKey

在这里插入图片描述

CacheKey:如下,根据各种信息拼接,最后成一个长字符串

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nrgwAhD0-1637916210386)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126145758389.png)]

  • 肯定有老哥说,搞了半天怎么还没执行我们写的sql方法啊!!!!!

  • 对于这里生成了对应的CacheKey后,他就会执行正式的方法了!!!。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-am8d7gRT-1637916210386)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126145721306.png)]

  • executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql):↓

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jpORYcg4-1637916210387)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126145918924.png)]

  • 他先看看MappedStatement的cache缓存里面有没有,那这里,因为我们是第一次执行,必然没有缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tYKYLR4F-1637916210388)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126150043856.png)]

  • 查询的过程,一开始会判断Executor关了没。没关就去缓存中拿,有就处理下返回,没有就去从数据库查。

  • 这里会涉及到一个queryStack,queryStack为0时就会清空本地的缓存clearLocalCache()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v1zvTq5r-1637916210389)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126151937849.png)]


  • 那我们看如果没有缓存,从数据库中查是什么逻辑queryFromDatabase

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OqUdXvhj-1637916210389)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126152201942.png)]

  • 他会给本地缓存先放一份这个内容,

  • Key:为我们之前生成的CacheKey

  • Value:EXECUTION_PLACEHOLDER占位符

  • localCache.putObject(key, EXECUTION_PLACEHOLDER);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9JFJTBeE-1637916210390)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126152419092.png)]

  • 然后他就去数据库查,他就怎么查呢,这里他会根据对应那种类型的Executor来有不同的逻辑,我们这里是用的SimpleExecutor

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OxbwGkRM-1637916210391)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126152534797.png)]

  • 根据ms获取到对应的mybatis的配置类信息,然后配置信息参数,sql语句等信息获取到对应的StatementHandler,他就是实际负责操作 Statement 对象与数据库进行交流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PX6356Or-1637916210392)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211126152742539.png)]

有人肯定会不知道Statement 是什么,Statement 是Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement对象,用于执行不带参数的简单SQL语句。

总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

  1. 技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
  2. 项目经历:只写明星项目,描述遵循 STAR 法则;
  3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

,不要写无关能力;
2. 项目经历:只写明星项目,描述遵循 STAR 法则;
3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

[外链图片转存中…(img-nzRNKJJZ-1715683858524)]

[外链图片转存中…(img-Qm2vRt2h-1715683858524)]

[外链图片转存中…(img-VoQSS0bg-1715683858525)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过docker搭建Redis集群的步骤如下: 1. 创建容器:使用docker命令创建多个Redis容器,每个容器代表一个节点。例如,可以使用以下命令创建一个名为redis-node-1的节点容器: ``` docker run --name redis-node-1 -p 6381:6379 -d redis ``` 2. 进入容器:使用docker exec命令进入容器内部,例如,可以使用以下命令进入redis-node-1容器: ``` docker exec -it redis-node-1 /bin/bash ``` 3. 构建集群关系:在容器内部,使用Redis命令行工具,将新增的节点作为master节点加入原集群。例如,可以使用以下命令将节点redis-node-7加入集群: ``` redis-cli -p 6381 cluster add-node <new_node_ip:port> <existing_node_ip:port> ``` 4. 查看集群状态:使用Redis命令行工具查看集群的状态。例如,可以使用以下命令在节点redis-node-1上查看集群信息: ``` redis-cli -p 6381 cluster info ``` 通过以上步骤,你可以使用docker搭建Redis集群,并查看集群的状态。请根据实际情况进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [阿昌你通过docker搭建Redis集群](https://blog.csdn.net/qq_43284469/article/details/122458602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值