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类

  1. UserMapper mapper = session.getMapper(UserMapper.class);当执行getMapper方法会最终委托到该方法,在Map方法中获取到MapperProxyFactory方法,拿到代理工厂类。
  2. 继续执行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面试题--阿呆中二相关推荐

  1. 3.MyBatis源码解析-CRUD执行流程--阿呆中二

    CRUD执行流程 MyBatis CRUD执行流程 与我联系 MyBatis 本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程.SqlSession构建流程.CR ...

  2. 2.MyBatis源码解析-SqlSession构建流程--阿呆中二

    SqlSession构建流程 MyBatis SqlSession构建流程 与我联系 MyBatis 本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程.SqlSe ...

  3. 4.MyBatis源码解析-MyBatis扩展点--阿呆中二

    MyBatis扩展点 MyBatis MyBatis扩展点 与我联系 MyBatis 本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程.SqlSession构建流 ...

  4. 【MyBatis源码解析】MyBatis一二级缓存

    MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...

  5. mybatis源码解析(一)

    Mybatis 源码解析 (一) 一. ORM框架的作用 实际开发系统时,我们可通过JDBC完成多种数据库操作.这里以传统JDBC编程过程中的查询操作为例进行说明,其主要步骤如下: (1)注册数据库驱 ...

  6. Mybatis源码解析《二》

    导语 在前一篇文章Mybatis源码解析<一>中,已经简单了捋了一下mybatis核心文件和mapper配置文件的一个基本的解析流程,这是理解mybatis的基本,和spring中的配置文 ...

  7. mybatis源码解析一 xml解析(解析器)

    最近闲来无事,看着一些源码类的书籍,只是光看,好像并不能给自己很好的益处,无法记下来,所以就有了这个Mybatis源码解析系列的博客.网上也有大量的源码解析,在此记录有两个原因,一是为了加深自己的印象 ...

  8. 对标阿里P8的MyBatis源码解析文档,面试/涨薪两不误,已献出膝盖

    移动互联网的特点是大数据.高并发,对服务器往往要求分布式.高性能.高灵活等,而传统模式的Java数据库编程框架已经不再适用了. 在这样的背景下,一个Java的持久框架MyBatis走入了我们的世界,它 ...

  9. Mybatis源码解析(一):环境搭建

    Mybatis源码系列文章 手写源码(了解源码整体流程及重要组件) Mybatis源码解析(一):环境搭建 Mybatis源码解析(二):全局配置文件的解析 Mybatis源码解析(三):映射配置文件 ...

最新文章

  1. Hash查找的基本原理及实现
  2. 多线程系列之学习多线程下载的基本原理和基本用法(1)
  3. vb.net2019-播放声音(wav、mp3等)
  4. 阿里云CentOS7.3搭建多用户私有git服务器(从安装git开始)
  5. Arm-Linux 编译Asterisk
  6. 美联储降息首日:资本市场反向操作 道指狂泻800点
  7. github删除已经push到服务器上的commit的方法
  8. bilibili怎么用用户名登录_bilibili账号安全中心 | 手游网游页游攻略大全
  9. (三)映射对象标识符(OID)
  10. oracle 丁勇 从零开始学_8.1.6 BETWEEN、IN和LIKE范围查询(1)
  11. mid、mif文件操作工具类
  12. 小功能--扫描二维码自动连接WiFi
  13. web前端入门到实战:纯CSS实现数据上报和HTML验证
  14. 浏览器打不开网页 服务器停止响应怎么办,浏览器打不开未响应怎么办
  15. windows 防火墙开启导致ping不通
  16. 【APICloud系列|31】成功上架5个应用商店总结(腾讯应用宝、阿里应用分发平台、华为开发者联盟、小米开放平台、百度开放平台)
  17. 监督学习和无监督学习简单理解
  18. saturn pcb toolkit相关功能界面介绍
  19. PL/SQL编程基础(五):异常处理(EXCEPTION)
  20. Moment函数上周/上月/今年/去年等时间开始和结束数组

热门文章

  1. Linux——用户的特殊shell与PAM模块
  2. 用python生成纯色图像
  3. win10内置Ubuntu安装图形界面
  4. 暑假来袭!带孩子配镜前,请先了解“散瞳验光”!
  5. 区块链开发指南_区块链开发权威指南
  6. 12-20210225华为海思Hi3518EV300在鸿蒙系统下测试WIFI(AP+STATION模式)
  7. 安全研究人员发现新的Android恶意软件:已感染1000多万部安卓手机
  8. package.json中private选项的作用
  9. java中属性是什么意思啊_Java中的字段和属性到底有什么区别?
  10. 迅雷网页嗅探下载链接的实现