前言
Mybatis是Java开发中不可或缺的一部分,也是面试必问的问题之一,我想每一个3年以下工作经验的码农都被问过 # 和 $ 的区别…
1.Mybatis是什么?
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
2.Mybatis的优缺点?
这个问题在某次面试中我遇到了,但是我思虑再三还是没找到Mybatis的缺点啊,还是百度好使。看来缺点也是和全自动ORM框架对比得出来的,但是优点也是特别明显的。
优点:
简单易学:没有任何第三方依赖,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
提供映射标签,支持对象与数据库的orm字段关系映射
提供对象关系映射标签,支持对象关系组建维护
提供xml标签,支持编写动态sql。
缺点:
编写SQL语句时工作量很大;
SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
二级缓存机制不佳,二级缓存机制是Mapper级别的,就可能导致脏读。参考《mybatis二级缓存缺陷》。
3.Mybatis执行流程
4.Mybatis常见面试题
1)在mapper.xml中,# 和 $ 的区别?
# 相当于原生JDBC中PreparedStatement,是带有预编译功能的,可以防止SQL注入,在SQL语句中会替换成?;$ 只是拼接字符串,将字符串拼接到SQL语句中。但是,表名和排序语句必须要用 $。
2)在mapper接口中,方法是否可以重载?
在mapper.xml中有一个namespace属性,该属性值对应其mapper接口全限定性类名,mapper接口中每个方法对应mapper.xml中的id,此id必须唯一,否则启动的时候就会报错。故,mapper中方法不可以重载。
5.Mybatis源码?