1. 什么是MyBatis?
MyBatis是一个实现了JPA规范的用来连接数据库并对其进行增删改查操作的开源框架 (就和传统的JDBC一样,就是个连接数据库的东西),其实,它底层就是一个JDBC封装的组件。MyBatis的前身是Ibatis,Ibatis创建与2002年最初为Apache下面的一个开源项目,2010迁移到google code下面并改名为MyBatis。
MyBatis虽然实现了JPA但是它并不是一个完完全全的ORM组件,而是一个基于SQL开发的半ORM组件。
而Hibernate是一个完完全全的ORM组件,它是完全基于对象来操作数据库中的记录,并不和MyBatis一样是一个假把式。
2. MyBatis优缺点
优点:
易于上手和掌握。
sql写在xml里,便于统一管理和优化。
解除sql与程序代码的耦合。
提供映射标签,支持对象与数据库的orm字段关系映射
提供对象关系映射标签,支持对象关系组建维护
提供xml标签,支持编写动态sql。
缺点:
sql工作量很大,尤其是字段多、关联表多时,更是如此。
sql依赖于数据库,导致数据库移植性差。
由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)
DAO层过于简单,对象组装的工作量较大。
不支持级联更新、级联删除。
编写动态sql时,不方便调试,尤其逻辑复杂时。
提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。
使用不当,容易导致N+1的sql性能问题。
使用不当,关联查询时容易产生分页bug。
若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)
多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)
缓存使用不当,容易产生脏数据。
3. 简述MyBatis的基本工作流程
Mybatis有两种工作方式,一种是通过Mapper接口的工作方式,另一种是通过SqlSession执行sql的传统Mybatis工作方式。
Mybatis两种工作方式流程图
传统工作方式流程图(方式一)
Mapper接口工作流程(方式二)
4. 接口绑定有几种实现方式,分别是怎么实现的?
接口绑定有两种实现方式
一种是通过注解绑定,就是在接口的方法上面加上@Select@Update等注解里面包含Sql语句来绑定
另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。
5. 什么情况下用注解绑定,什么情况下用xml绑定 ?
注解:是一种分散式的元数据,与源代码紧绑定。
xml:是一种集中式的元数据,与源代码无绑定。
因此注解和XML的选择上可以从两个角度来看:分散还是集中,源代码绑定/无绑
6. MyBatis动态sql是做什么的
传统jdbc方法中,在写组合的多表复杂sql语句时,需要去拼接sql语句,稍不注意少写一个空格或“”,就会导致报错。
这个Mybatis动态sql的功能,就拥有有效的解决了这个问题,Mybatis动态sql语言可以被用在任意的sql语句映射中。