MyBatis相关面试题

MyBatis与Hibernate的区别?

MyBatis:
不完全是一个的ORM框架,需要程序员自己编写SQL语句,可以严格控制SQL的执行性能,灵活度高,但是mybatis无法做到数据库无关性。
Hibernate:
对象/关系映射能力强,数据库无关性好,但是对sql的控制性能差,应为无需程序员编写sql

MyBatis的优缺点?

优点:
1:基于SQL语句编程,相对灵活。
2:与JDBC相比,减少代码量。
3:很好的与各种数据库兼容。
4:能够和Spring框架很好的集成。
缺点:
1:SQL语句的编写工作量比较大
2:SQL语句过分依赖数据库,移植性差。
#{}是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 20: …符串替换 MyBatis在处理#̲{}的时,会将SQL语句中的#…{}的时,就是把${}替换成变量的值。

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

#{} 为参数占位符 ?,即sql 预编译,输入的参数就会填入?中,KaTeX parse error: Expected 'EOF', got '#' at position 32: …拼接,会有sql注入的风险。 #̲{} 能防止sql 注入,{} 不能防止sql 注入。

mybatis 有几种分页方式?

分页方式:逻辑分页和物理分页
1、数组分页
2、借助Sql语句进行分页
3、RowBounds实现分页

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

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

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

逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。
物理分页是从数据库查询指定条数的数据,弥补了一次性全部查出的所有数据的种种缺点,比如需要大量的内存,对数据库查询压力较大等问题。

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

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

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

一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,它的声明周期是和 SQLSession 一致的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会出现脏数据。当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认一级缓存是开启的。
二级缓存:也是基于 PerpetualCache 的 HashMap 本地缓存,不同在于其存储作用域为 Mapper 级别的,如果多个SQLSession之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态)。

mybatis 和 hibernate 的区别有哪些?

1、灵活性:MyBatis 更加灵活,自己可以写 SQL 语句,使用起来比较方便。
2、可移植性:MyBatis 有很多自己写的 SQL,因为每个数据库的 SQL 可以不相同,所以可移植性比较差。
3、学习和使用门槛:MyBatis 入门比较简单,使用门槛也更低。
4、二级缓存:hibernate 拥有更好的二级缓存,它的二级缓存可以自行更换为第三方的二级缓存。

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批处理相同。

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

分页插件的原理就是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,然后根据设置的dialect(方言),和设置的分页参数,重写SQL ,生成带有分页语句的SQL,执行重写后的SQL,从而实现分页。
所以原理还是基于拦截器

mybatis 如何编写一个自定义插件?

Mybatis自定义插件针对Mybatis四大对象(Executor、StatementHandler 、ParameterHandler 、ResultSetHandler )进行拦截,具体拦截方式为:
1、Executor:拦截执行器的方法(log记录)
2、StatementHandler :拦截Sql语法构建的处理
3、ParameterHandler :拦截参数的处理
4、ResultSetHandler :拦截结果集的处理
前两种应用较为广泛。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值