Mybatis面试题

Mybatis的优缺点

优点:
基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML 标签, 支持编写动态 SQL 语句, 并可重用。
与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;
很好的与各种数据库兼容( 因为 MyBatis 使用 JDBC 来连接数据库,所以只要JDBC 支持的数据库 MyBatis 都支持)。
能够与 Spring 很好的集成;
提供映射标签, 支持对象与数据库的 ORM 字段关系映射; 提供对象关系映射标签, 支持对象关系组件维护。
缺点:
SQL 语句的编写工作量较大, 尤其当字段多、关联表多时, 对开发人员编写SQL 语句的功底有一定要求。
SQL 语句依赖于数据库, 导致数据库移植性差, 不能随意更换数据库。

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

#{}是预编译处理、是占位符, KaTeX parse error: Expected 'EOF', got '#' at position 26: …拼接符。 Mybatis在处理#̲{}时,会将sql中的#{}替…{}时,会将sql中的${}替换成变量的值,调用 Statement 来赋值;
使用#{}可以有效的防止 SQL 注入, 提高系统安全性。

MyBatis 与Hibernate 有哪些不同?

Hibernate是一个完整的ORM框架,功能更加强大,操作更加简单(性能不好控制),如果你要使用Hibernate控制性能,你必须是一个Hinernate高手。
对于一个大项目,Hibernate确实不是很合适,如果大项目一定要使用Hibernate,进行混合使用,一般的操作使用Hibernate,对于性能的要求比较高的使用原生的SQL。
mybatis不是完整的ORM框架,需要自己编写SQL语句。
好处:自己写SQL,自己控制性能。(更好控制)
坏处:自己写SQL,很麻烦
Hibernate是一个完整的ORM框架,使用更加简单,功能更加强大,性能不好控制(中小项目使用的多)
Mybatis也封装了很多的原生的JDBC,是一个半ORM框架,性能可控(SQL需要自己写)

Mybatis 的插件运行原理,如何编写一个插件。

Mybatis 只支持针对 ParameterHandler、ResultSetHandler、StatementHandler、Executor 这4 种接口的插件, Mybatis 使用 JDK 的动态代理, 为需要拦截的接口生成代理对象以实现接口方法拦截功能, 每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是 InvocationHandler 的invoke() 方法, 拦截那些你指定需要拦截的方法。
编写插件: 实现 Mybatis 的 Interceptor 接口并复写 intercept()方法, 然后在给插件编写注解, 指定要拦截哪一个接口的哪些方法即可, 在配置文件中配置编写的插件。

Mybatis的一级、二级缓存面试题

一级缓存
MyBatis的一级缓存是基于内存的,SqlSession级别的缓存,底层数据结构基于PerpetualCache的一个HashMap,key是由sql语句、条件、statement等信息组成的唯一标识,存在线程安全问题。一级缓存是强制开启的,可以通过设置statement的scope=statement来配置每次都clear缓存。一级缓存在BaseExecutor中实现。当一次SqlSession会话中,每次查询的结果集都会缓存到cache中,但是只要两次查询间,存在update、delete、insert操作就会清空缓存。
二级缓存
MyBatis的二级缓存也是基于内存,是NameSpace(Mapper)级别。默认是开启的,也可以配置关闭。二级缓存是CachingExecutor执行器管理,每当一个SqlSession在做commit操作的时候,就会清空一级缓存,将一级缓存的内容刷到二级缓存中。 一个SQL执行的时候,会先判断二级缓存中是否存在缓存,没有才会去检查一级缓存。MyBatis的二级缓可以使用软引用、弱引用、FIFO或者LRU(默认)机制来管理内存溢出问题。 二级缓存同样在遇到增删改的操作时会刷新缓存,而且二级缓存可以配置定期的刷新策略。 二级缓存默认会缓存1024个元素。

自定义二级缓存
MyBatis的二级缓存还可以自定义实现,通过引入ehcache的包来实现二级缓存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值