5.MyBatis源码解析-MyBatis面试题--阿呆中二
MyBatis面试题
- MyBatis
- MyBatis面试题
- MyBatis一级缓存和二级缓存?
- MyBatis 有几种执行器和区别?
- Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
- Mybatis是如何进行分页的?分页插件的原理是什么?
- Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
- 与我联系
MyBatis
本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程、SqlSession构建流程、CRUD执行流程、MyBatis扩展点,以及针对面试题进行源码分析。
mybatis 3.x源码深度解析与最佳实践下载:https://download.csdn.net/download/u013425841/12816685
MyBatis面试题
MyBatis一级缓存和二级缓存?
MyBatis默认开启一级缓冲,一级缓存是SQLSession级别,同一个SQLSessioon共享缓存,可以看到一级缓存实现是在BaseExecutor中
localCache是PerpetualCache的对象,PerpetualCache底层使用是HashMap实现的缓存
一级缓存合适失效?
1.设置flushCache=true
2. 在configuration标签的settings配置属性localCacheScope=STATEMENT,默认是Session级别
3.commit\rollback\update等操作,都会更新一级缓存,query对应的就是上面两种情况
MyBatis二级缓存,不同Session级别共享,STATEMENT级别的,需要设置开启二级缓存
二级缓存的执行流程:
1.首先获取缓存的Cache对象
2.判断是否存在对应key的缓存
3.不存在的话put进去对应的缓存
可以发现操作的是tcm对象,那么tcm对象是什么呢?
可以看到tcm是TransactionalCacheManager类的实例对象,它提供了事物和缓存操作的几种方法;
值得注意的是,二级缓存需要commit之后才能生效,没有commit的之前保存在中间map中
MyBatis 有几种执行器和区别?
SimpleExecutor:简单执行器
ReuseExecutor:可重用执行器
BatchExecutor:批量处理器
CachingExecutor:缓存执行器
https://javalearn.blog.csdn.net/article/details/112105106
Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
首先Dao接口的实现原理是基于JDK动态代理,详细处理流程如下:
1.首先在解析xml的时候会生成MapperProxyFactory存在Map中,key是当前Dao的Class类
- UserMapper mapper = session.getMapper(UserMapper.class);当执行getMapper方法会最终委托到该方法,在Map方法中获取到MapperProxyFactory方法,拿到代理工厂类。
- 继续执行newInstance方法可以看到,使用Proxy生成代理类
4.MapperProxy类实现了InvocationHandler类的invoke方法
5.继续执行CacheInvoker的invoke方法
6.委托给MapperMethod.execute方法,最终根据command命令执行对应的Insert、Update、DELETE、SELECT等方法
从mybatis的设计角度来说,dao是不允许重载的,因为mybatis在解析xml文件的时候,是用方法名作为唯一的key存储mappedStatement的
使用的是mybatis重写的StrictMap, put方法进行了验证,重复会抛出异常
Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数
Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。它的原理是,使用 Javassist 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。这就是延迟加载的基本原理。当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都是一样的。
创建代理对象
与我联系
Java/一对一零基础辅导/公司项目一对一辅导/日常Bug解决/代码讲解/毕业设计等 微信:study_51ctofx
5.MyBatis源码解析-MyBatis面试题--阿呆中二相关推荐
- 3.MyBatis源码解析-CRUD执行流程--阿呆中二
CRUD执行流程 MyBatis CRUD执行流程 与我联系 MyBatis 本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程.SqlSession构建流程.CR ...
- 2.MyBatis源码解析-SqlSession构建流程--阿呆中二
SqlSession构建流程 MyBatis SqlSession构建流程 与我联系 MyBatis 本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程.SqlSe ...
- 4.MyBatis源码解析-MyBatis扩展点--阿呆中二
MyBatis扩展点 MyBatis MyBatis扩展点 与我联系 MyBatis 本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程.SqlSession构建流 ...
- 【MyBatis源码解析】MyBatis一二级缓存
MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...
- mybatis源码解析(一)
Mybatis 源码解析 (一) 一. ORM框架的作用 实际开发系统时,我们可通过JDBC完成多种数据库操作.这里以传统JDBC编程过程中的查询操作为例进行说明,其主要步骤如下: (1)注册数据库驱 ...
- Mybatis源码解析《二》
导语 在前一篇文章Mybatis源码解析<一>中,已经简单了捋了一下mybatis核心文件和mapper配置文件的一个基本的解析流程,这是理解mybatis的基本,和spring中的配置文 ...
- mybatis源码解析一 xml解析(解析器)
最近闲来无事,看着一些源码类的书籍,只是光看,好像并不能给自己很好的益处,无法记下来,所以就有了这个Mybatis源码解析系列的博客.网上也有大量的源码解析,在此记录有两个原因,一是为了加深自己的印象 ...
- 对标阿里P8的MyBatis源码解析文档,面试/涨薪两不误,已献出膝盖
移动互联网的特点是大数据.高并发,对服务器往往要求分布式.高性能.高灵活等,而传统模式的Java数据库编程框架已经不再适用了. 在这样的背景下,一个Java的持久框架MyBatis走入了我们的世界,它 ...
- Mybatis源码解析(一):环境搭建
Mybatis源码系列文章 手写源码(了解源码整体流程及重要组件) Mybatis源码解析(一):环境搭建 Mybatis源码解析(二):全局配置文件的解析 Mybatis源码解析(三):映射配置文件 ...
最新文章
- Hash查找的基本原理及实现
- 多线程系列之学习多线程下载的基本原理和基本用法(1)
- vb.net2019-播放声音(wav、mp3等)
- 阿里云CentOS7.3搭建多用户私有git服务器(从安装git开始)
- Arm-Linux 编译Asterisk
- 美联储降息首日:资本市场反向操作 道指狂泻800点
- github删除已经push到服务器上的commit的方法
- bilibili怎么用用户名登录_bilibili账号安全中心 | 手游网游页游攻略大全
- (三)映射对象标识符(OID)
- oracle 丁勇 从零开始学_8.1.6 BETWEEN、IN和LIKE范围查询(1)
- mid、mif文件操作工具类
- 小功能--扫描二维码自动连接WiFi
- web前端入门到实战:纯CSS实现数据上报和HTML验证
- 浏览器打不开网页 服务器停止响应怎么办,浏览器打不开未响应怎么办
- windows 防火墙开启导致ping不通
- 【APICloud系列|31】成功上架5个应用商店总结(腾讯应用宝、阿里应用分发平台、华为开发者联盟、小米开放平台、百度开放平台)
- 监督学习和无监督学习简单理解
- saturn pcb toolkit相关功能界面介绍
- PL/SQL编程基础(五):异常处理(EXCEPTION)
- Moment函数上周/上月/今年/去年等时间开始和结束数组
热门文章
- Linux——用户的特殊shell与PAM模块
- 用python生成纯色图像
- win10内置Ubuntu安装图形界面
- 暑假来袭!带孩子配镜前,请先了解“散瞳验光”!
- 区块链开发指南_区块链开发权威指南
- 12-20210225华为海思Hi3518EV300在鸿蒙系统下测试WIFI(AP+STATION模式)
- 安全研究人员发现新的Android恶意软件:已感染1000多万部安卓手机
- package.json中private选项的作用
- java中属性是什么意思啊_Java中的字段和属性到底有什么区别?
- 迅雷网页嗅探下载链接的实现