Java关于MyBatis常见面试题及答案
1、mybatis 中 #{}和 ${}的区别是什么?
- #{}是预编译处理,${}是字符串替换;
- Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
- 使用#{}可以有效的防止SQL注入,提高系统安全性,
- Mybatis在处理
${}
时,就是把${}替换成变量的值。
2、mybatis 的一级缓存和二级缓存?
- 一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session。当用户查询信息时,SqlSession首先到一级缓存域查询,如果没有数据,则从数据库查询,然后将结果保存到一级缓存中。若SqlSession执行了commit操作,则会清空一级缓存区域,以此来保证缓存中的信息是最新的,避免脏读的现象。默认打开一级缓存。
- 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。当多个SqlSession类的实例对象加载相同的Mapper文件,并执行执行其中的SQL配置时,它们共享一个Mapper缓存。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要在MyBatis的全局配置文件中配置Setting属性,设置名为“cacheEnabled”的属性值为“true”,实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/> 。
3、 mybatis 和 hibernate 的区别有哪些?
(1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。
(2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
(3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。
4、MyBatis的特点?
采用配置文件动态管理SQL语句,并含有输入映射、输出映射机制以及数据库连接池配置的持久层框架。整体的构造由数据源配置文件、SQL映射配置文件、会话工厂、会话执行器以及底层封装对象组成。
5、MyBatis运行流程?
首先SqlSessionFactory会话工厂通过Resources资源信息加载对象获取配置文件信息,然后产生可以与数据库进行交互的会话示例SqlSession.会话示例可以根据Mapper配置文件和SQL配置,执行相应的增删改查操作。
6、MyBatis中Mapper实现动态代理?
新建一个interface接口,接口名称保持与某个mapper.xml配置文件相同。mapper配置文件的namespace指定接口的路径用SqlSession类获取Mapper代理来执行SQL映射配置,使用Mapper代理可以省去DAO层的实现类,从而提升开发效率。