Mybatis常见面试题(一)

1MyBatis #{} ${}的区别是什么?

#{}是预编译处理,${}是字符替换。

在使用 #{}时,MyBatis 会将 SQL 中的 #{}替换成“?”,配合 PreparedStatement 的 set 方法赋值,这样可以有效的防止 SQL 注入,保证程序的运行安全。


2MyBatis 有哪两种分页方式?

逻辑分页: 使用 MyBatis 自带的 RowBounds 进行分页,它是一次性查询很多数据,然后在数据中再进行检索。

物理分页: 自己手写 SQL 分页或使用分页插件 PageHelper,去数据库查询指定条数的分页数据的形式。


3RowBounds 是一次性查询全部结果吗?为什么?

不是。RowBounds 表面是在“所有”数据中检索数据,其实并非是一次性查询出所有数据。

因为 MyBatis 是对 jdbc 的封装,在 jdbc 驱动中有一个 Fetch Size 的配置,它规定了每次最多从数据库查询多少条数据,假如你要查询更多数据,它会在你执行 next()的时候,去查询更多的数据。

就好比你去自动取款机取 10000 元,但取款机每次最多能取 2500 元,所以你要取 4 次才能把钱取完。只是对于 jdbc 来说,当你调用 next()的时候会自动帮你完成查询工作。这样做的好处可以有效的防止内存溢出。


4MyBatis 是否支持延迟加载?延迟加载的原理是什么?

MyBatis 支持延迟加载,设置 lazyLoadingEnabled=true 即可。

延迟加载的原理的是调用的时候触发加载,而不是在初始化的时候就加载信息。比如调用 a. getB(). getName(),这个时候发现 a. getB() 的值为 null,此时会单独触发事先保存好的关联 B 对象的 SQL,先查询出来 B,然后再调用 a. setB(b),而这时候再调用 a. getB(). getName() 就有值了,这就是延迟加载的基本原理。


当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。


5、说一下 MyBatis 的一级缓存和二级缓存?

一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,它的生命周期是和 SQLSession 一致的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会出现脏数据。当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认一级缓存是开启的。


二级缓存:也是基于 PerpetualCache 的 HashMap 本地缓存,不同在于其存储作用域为 Mapper 级别的。如果多个SQLSession之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态)。


开启二级缓存数据查询流程:二级缓存 -> 一级缓存 -> 数据库。

缓存更新机制:当某一个作用域(一级缓存 Session/二级缓存 Mapper)进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。


6MyBatis 有哪些执行器(Executor)?

MyBatis 有三种基本的Executor执行器:

SimpleExecutor:每执行一次 update 或 select 就开启一个 Statement 对象,用完立刻关闭 Statement 对象;

ReuseExecutor:执行 update 或 select,以 SQL 作为 key 查找 Statement 对象,存在就使用,不存在就创建,用完后不关闭 Statement 对象,而是放置于 Map 内供下一次使用。简言之,就是重复使用 Statement 对象;

BatchExecutor:执行 update(没有 select,jdbc 批处理不支持 select),将所有 SQL 都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch()完毕后,等待逐一执行 executeBatch()批处理,与 jdbc 批处理相同。


作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。


7Mybatis有哪四大对象?

Executor、ParameterHandler、StatementHandler、ResultSetHandler


8MyBatis 分页插件的实现原理是什么?

分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 SQL,然后重写 SQL,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。


9、什么是MyBatis的接口绑定?有哪些实现方式?

接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。


接口绑定有两种实现方式:

通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;

通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。当Sql语句比较简单时候,用注解绑定, 当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多。

10Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签:

trim、where、set、foreach|、if、choose、when、otherwise、bind。


其执行原理为,使用OGNLsql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

内容来源公众号:小谢backup

#面试题目#
全部评论
标准八股文
点赞 回复 分享
发布于 2021-03-16 11:27

相关推荐

09-24 09:36
门头沟学院 Java
小红书java面经自我介绍(一面没问项目)询问学习了多久的java?1.Hashmap的数据结果组成?2.Hashmap是线程安全的吗?3.CurrentHashmap是线程安全的吗?4.CAS操作5.如何解决hash冲突?(听过)6.手撕   在本地手写单列模式  (双重检验锁试) 然后让写一个颜色工厂实例 (没写出来,讲了一下思路)小红书Java实习一面1.@Autowired和@Resource的区别,(Autowired翻译是自动装配)1.注解@Autowired和@Resource的区别?@Auowired是如何注入的?2.Spring和Spring boot的区别?Spring Boot 比 Spring优化在哪里,为什么更轻量级?3.Spring的自动装配过程,如何识别出要装配的类?会扫描全部的类吗?4.Spring AOP有哪些注解?5.List有哪些线程安全的类,哪些非线程安全的类?ArrayList和 LinkedList 的区别?ArrayList 的扩容机制?LinkedList的删除操作是 O(1)的吗?6.讲一下Syncronized关键字的底层实现原理。介绍一下偏向锁,轻量级锁。volatile有哪些作用?- Synchronized:通过对象头和 Monitor 实现线程同步,依赖底层 Mutex Lock- 偏向锁:减少无竞争时的锁开销,记录线程 ID- 轻量级锁:多线程交替执行时避免重量级锁的性能消耗- Volatile:保证可见性和禁止指令重排序,不保证原子性7.讲一下单例模式有哪几种实现方式lan,e,双8.final关键字修饰变量,方法,类,有什么区别?修饰方法的话,里边的数据能修改吗?修饰类的话,里边的方法可以修改吗?里边的方法可以被重写吗?可以通过反射来修改里边的属性吗?无论什么情况下都可以通过反射来修改吗?9.讲一下Java面向对象的三大特性。说一下你对多态的理解10.线程池有哪些参数,分别讲一下有什么作用?拒绝策略有哪几种?11.Executors工具类可以用来创建线程池对吧,那么里边具体有哪些方法?12.Object类中包含哪些方法?wait()和 sleep() 有什么区别?getClass(),hashCode(),wait(),equals(),clone(),toString(),notify(),notifyAll13.死锁发生的原因。如何解决死锁问题?14.介绍一下双亲委派机制,使用场景,有什么好处?15.类加载的过程。16.什么时候会发生old GC,年轻代和老年代的比例。讲一下GC回收过程。年轻代的一块region一般是多大?年轻代专门存储大对象的空间是哪里?Old GC 和 Minor GC的区别? 常见的GC Root类型有哪些?17.类的对象头里边存有什么数据?18.TCP/IP有哪几层?每一层分别有哪些协议?报文段的最大限制是多少字节?这个主要是受什么限制导致的? 描述一下TCP流量控制的滑动窗口机制19.介绍一下DNS协议,DNS协议在哪一层?20.讲一下Redis的缓存穿透,缓存击穿,缓存雪崩,他们的解决方案分别有什么? Redis里边有一些数量很少,但是访问很频繁的热key,如何高效的,快速的把他们找出来21.https 协议和 http 的区别? 如何通过TLS/SSL协议建立加密通道,描述一下这个过程手撕,判断链表是否成环,如果成环求环的长度。6.26北京经纬恒润java校招一面0 刚才介绍的流程落到代码实现能说一下嘛(开了共享打开了一下idea给面试官看代码)1 final关键字的作用2 抽象类和接口的区别3 如果抽象类被继承的子类没有实现其全部抽象方***怎么样4 结合你的项目举例说明你是怎么用线程池的5 用过什么设计模式吗6 介绍一下你用的策略模式7 spring的aop8 结合设计模式说说aop的实现9 静态代理两种方法的特点10 说说反射的作用和优缺点11 redis的持久化机制有哪些12 hashmap的使用场景6.24美团财务后端面经1 注册中心不可用了微服务之间还能相互调用吗2 rpc调用过程3 看你用了redis和es,为什么用了多个缓存组件4 redis单线程效率为什么快Redis 采用单线程模型的设计,主要是为了提升性能、简化逻辑并避免多线程带来的复杂性。以下是其核心优势和原因:Redis 的单线程模型避免了多线程之间的竞争问题。多线程需要使用锁机制来保证数据一致性,这会带来额外的开销,例如加锁、解锁和线程切换。同时,多线程可能导致死锁问题,增加了代码的复杂性。而单线程模型确保了所有请求的串行执行,不需要额外的锁机制,从而提高了稳定性和执行效率(1)(2)。Redis 使用 I/O 多路复用机制(如 epoll),使单线程能够同时处理多个客户端请求。这种机制避免了 I/O 阻塞问题,并且由于 Redis 的操作大多是内存操作,速度极快,单线程足以支撑高并发场景(1)(2)。Redis 的核心操作简单且高效,主要是基于内存的键值存储,操作复杂度通常为 O(1) 或 O(log N)。5 redis有哪些数据结构6 使用redis集群的话,数据分区过程是什么样7 es的分词过程有了解吗1. 连接ElasticSearch2. 创建索引并设置分词器3. 索引文档4. 执行分词查询5. 处理查询结果8 MongoDB和mysql实用场景区别,优缺点MongoDB适合用于大数据量、高并发、非结构化数据的场景,而MySQL则更适合需要强一致性和复杂事务处理的关系型数据场景(1)。9 mysql的acid如何实现undo log。如果事务失败或调用了rollback,InnoDB会利用undo log将数据回滚到修改前的状态(1)。MySQL通过redo log来实现持久性。InnoDB在事务提交时会将操作记录到redo log,并调用fsync接口将其写入磁盘。如果MySQL宕机,重启时可以通过redo log恢复数据(2)。MySQL通过锁机制和**MVCC(多版本并发控制)**来实现隔离性。一致性确保事务执行前后数据库的状态是一致的。10 事务隔离级别的读已提交和可重复读怎么实现在数据库中,事务隔离级别中的读已提交(Read Committed)和可重复读(Repeatable Read)主要通过锁机制和多版本并发控制(MVCC)来实现11 mysql的索引的建立选择和依据12 你去建立索引要考量的因素有哪些13 mysql适合范围查询吗14 tcp怎么解决数据损坏丢包乱序问题15 算法:反转链表快手-增量投放部门 1面 2025-07-15-19:30项目:拼团 rag&mcp(完全不感兴趣) 动态线程池说一下在项目实现的时候遇到的非常难忘的事情。规则树模式 ✅人群标签 ✅领域驱动设计的好处 (✅❌,答得一般,没答到要点)动态配置中心设计 ✅动态降级和切量降级的目的 ✅你是否知道规则树模式的其他场景 ❌介绍策略模式 ✅拼团营销策略是否可以叠加?✅责任链模式的设计实现 ✅你是否知道责任链应用的其他场景?❌你为什么使用mq通信,而不是用rpc进行微服务通信?❌项目做过压测吗?❌动态线程池的几个参数和执行流程 ✅创建对象有几种方式?❌反射的使用场景 ❌线程池核心线程数应该怎么设计 ✅手撕:线程1-100循环打印 不会,换题。BM16 删除有序链表中的重复元素-I字节生活服务后端一面自我介绍,拷打项目我有 10 万个路径规则,然后我要怎么存储这些路径规则?然后当一个请求 path 传过来的时候,我该怎么快速判断它是否在这路径规则里面?redis和数据库同步策略热点数据更新,redis一瞬间失效会有什么问题,怎么解决?算法:最长无重复子串(限时5min)字节 一面根据简历问项目,你觉得项目比较难的点?你的延时任务怎么实现的?kafka的延迟队列怎么实现?kafka优先队列?对比一下kafka和rabbitmq?rabbitmq 和 消费者之间采用什么模式?Spring AOP有实现过代理模式吗?说一下mysql隔离级别?讲一下redis的Zset的底层数据结构?优先队列实现?讲讲java、kafka、rabbitmq 的延迟队列?算法题: 简单的在图中dps字节实习面经Redis 数据结构Redis 分布式架构分布式锁实现OSI 七层模型空Channel算法题:最长回文子串字节后端一面java面经说说项目背景说说项目里的防超买你说用到了rabbitmq,如何保证可靠性算法 寻找两个不定排序有重复的数组的中位数字节后端实习一面面经总共面试了一个小时,汗流浃背了自我介绍项目的拷打(大约15分钟)Java八股:线程进程区别使用多线程还是多进程僵尸线程计算机网络:tcp/ip网络分层tcp和udp区别以及使用领域阻塞控制(是我在前面提到了这个)MySQL八股事务级别,能防止哪些问题临时表算法怎么使用1到5的随机选择器实现1到7的随机选择器 二叉树不相邻节点之和最大值
点赞 评论 收藏
分享
评论
7
50
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务