王京 的个人博客

记录精彩的程序人生

  menu
44 文章
0 浏览
1 当前访客
ღゝ◡╹)ノ❤️

Java 常见的面试题(Mybatis)

一、mybatis 中 #{}和 ${}的区别是什么?

  1. #{}是预编译处理,$ {}是字符串替换。
  2. MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用PreparedStatement的set方法来赋值;MyBatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。
  3. 使用 #{} 可以有效的防止SQL注入,提高系统安全性。

二、mybatis 有几种分页方式?

  1. LIMIT关键字:
  2. interceptor plugin实现:需要定义一个类实现Interceptor接口
  3. PageHelper实现:这种方式实现需要我们引入maven依赖;(其实PageHelper方法是使用Interceptor拦截器方式的一种三方实现,它内部帮助我们实现了Interceptor的功能。我们不用自定义MyPageInterceptor)

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

**RowBounds ** 表面是在“所有”数据中检索数据,其实并非是一次性查询出所有数据,因为 MyBatis 是对 jdbc 的封装,在 jdbc 驱动中有一个 Fetch Size 的配置,它规定了每次最多从数据库查询多少条数据,假如你要查询更多数据,它会在你执行 next()的时候,去查询更多的数据。就好比你去自动取款机取 10000 元,但取款机每次最多能取 2000 元,所以你要取 5 次才能把钱取完。只是对于 jdbc 来说,当你调用 next()的时候会自动帮你完成查询工作。这样做的好处可以有效的防止内存溢出。

四、mybatis 逻辑分页和物理分页的区别是什么?

  1. 逻辑分页是先查出来,然后利用代码去取需要的部分;物理分页是利用sql自带的limit去实现的,本身查询出来的数据是就算分页好的
  2. 逻辑分页 内存开销比较大,在数据量比较小的情况下效率比物理分页高;在数据量很大的情况下,内存开销过大,容易内存溢出,不建议使用
  3. 物理分页 内存开销比较小,在数据量比较小的情况下效率比逻辑分页还是低,在数据量很大的情况下,建议使用物理分页

五、mybatis 是否支持延迟加载?延迟加载的原理是什么?

Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。

原理: 使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。这就是延迟加载的基本原理。当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都是一样的。

六、说一下 mybatis 的一级缓存和二级缓存?

  • Mybatis的一级缓存: 是默认开启的,它只相对于同一个SqlSession有效,所以也称之为SqlSession缓存。当参数和SQL完全相同的情况下,使用同一个SqlSession对象调用同一个Mapper方法,当第1次执行SQL语句后,MyBatis会自动将其放在缓存中,后续再次查询时,如果没有声明需要刷新,且缓存没有超时,会直接取出此前缓存的数据,而不会再次发送SQL到数据库。
  • Mybatis的二级缓存: 是默认未开启的,如果希望开启,需要在配置SQL的XML文件中配置节点,由于每个XML都通过根节点的namespace属性对应一个Mapper接口,所以,二级存储也称之为namespace缓存!在使用二级存储时,查询数据的

标题:Java 常见的面试题(Mybatis)
作者:wangjing
地址:https://www.codedblogs.cn/articles/2024/04/12/1712889591758.html