2019-08-11

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两种工作方式流程图

2019-08-11_第1张图片

传统工作方式流程图(方式一)

2019-08-11_第2张图片

Mapper接口工作流程(方式二)

2019-08-11_第3张图片

4. 接口绑定有几种实现方式,分别是怎么实现的?

接口绑定有两种实现方式

一种是通过注解绑定,就是在接口的方法上面加上@Select@Update等注解里面包含Sql语句来绑定

另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。

5. 什么情况下用注解绑定,什么情况下用xml绑定 ?

注解:是一种分散式的元数据,与源代码紧绑定。

xml:是一种集中式的元数据,与源代码无绑定。

因此注解和XML的选择上可以从两个角度来看:分散还是集中,源代码绑定/无绑

6. MyBatis动态sql是做什么的

传统jdbc方法中,在写组合的多表复杂sql语句时,需要去拼接sql语句,稍不注意少写一个空格或“”,就会导致报错。

这个Mybatis动态sql的功能,就拥有有效的解决了这个问题,Mybatis动态sql语言可以被用在任意的sql语句映射中。

你可能感兴趣的:(2019-08-11)