Mybatis相关面试题
1、mybatis优缺点有哪些?
优点:
与JDBC相比,消除JDBC大量冗余代码(加载驱动、创建连接、准备sql、准备Statement、处理结果、关闭连接),不需要手动开关连接。
与数据库兼容。(MyBatis使用JDBC连接数据库)
较好集成Spring
sql写在XML里,从代码程序中解耦合,重用(ResultMap)
提供XML标间,支持编写动态SQL语句
提供映射标签,支持对象与数据库的ORM字段关系映射
缺点:
SQL语句编写工作量大(字段多、关联表多)
SQL语句依赖数据库,导致数据库移植性差,不能随意更换数据库。
2、mybatis和hibernate有什么区别?
相同点:
都是由XML配置文件生成SessionFactory,然后由SessionFactory生成Session,最后由Session执行事务和SQL语句
都支持JDBC和JTA事物处理
不同点
hibernate全自动;mybatis半自动。Hibernate完全可以通过对象关系模型实现对数据库的操作,完整的JavaBean对象对数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系需要手写sql来实现和管理。
hibernate数据库移植性远大于mybatis。hibernate的映射结构和hql语言降低对象与数据库的耦合性
hibernate有完整的日志系统,mybatis略差一些
hibernate配置复杂。
sql优化,mybatis更方便
缓存机制,hibernate更好一些
3、mybatis中#{}和${}的区别是什么?
#{}是预编译,会将sql中#{}替换为?号,调用RreparedStatement的set方法来赋值,有效防止SQL注入,提高系统安全性;
${}是字符串替换,处理${}时,会替换成变量的值
4、Mybatis中的缓存
Mybatis默认的缓存策略【LRU,移除最长时间不被使用的对象】;FIFO
一级缓存默认开启,sqlsession级别的缓存,也叫本地会话缓存。只在一次SqlSession中有效,从拿到连接到关闭。
缓存失效:
① 增删改操作,可能会改变原来的数据,所以必定会刷新缓存,缓存失效。
② 手动清理缓存 sqlSession.clearCache();
二级缓存需要手动开启和配置,基于namespace级别的缓存
为了提高扩展性,Mybatis定义了缓存接口Cache,可以通过实现Cache接口来自定义二级缓存
为什么使用二级缓存? 一起缓存作用域太低。
如何开启二级缓存?
① 在mybatis-config.xml中
<settings>
<!-- 显示开启全局缓存 -->
<setting name="cacheEnabled" value="true"><setting/>
</settings>
在SQL映射文件(mapper.xml)中添加一行 <cache />
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
工作机制:
一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中。若当前会话关闭,这个会话对应的一级缓存就没了;
,会话提交或关闭,一级缓存数据保存到二级缓存;
新的会话查询信息,就可以从二级缓存中获取内容
不同mapper.xml查出的数据会放在自己对应的缓存(map)中
细节:内存的缓存也需要序列化
总结:只要开启了二级缓存,在同一个Mapper下就有效。