MyBatis面试题

76 阅读5分钟

一、什么是MyBatis?

(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。

(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。

二、说说MyBatis的优点和缺点

优点:

(1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。

(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;

(3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。

(4)能够与Spring很好的集成;

(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象 关系组件维护。

缺点:

(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

三、#{}和${}的区别是什么?

#{} 是占位符,预编译处理,${}是字符串替换。

Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set法来赋值;

Mybatis 在处理时,就是把{}时,就是把{}替换成变量的值。

使用#{}可以有效的防止 SQL 注入,提高系统安全

四、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

第2种: 通过来映射字段名和实体类属性名的一一对应的关系。

五、在 mybatis 中,resultType 和 ResultMap 的区别是什么?(必会)

如果数据库结果集中的列名和要封装实体的属性名完全一致的话用 resultType 属性

如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用 resultMap 属性,通过 resultMap 手动建立对象关系映射,resultMap 要配置一下表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来

六、在 Mybatis 中你知道的动态 SQL 的标签有哪些?作用分别是什么?

  1. if 是为了判断传入的值是否符合某种规则,比如是否不为空.
  2. where 标签可以用来做动态拼接查询条件,当和 if 标签配合的时候,不用显示的声明类型 where 1 = 1 这种无用的条件
  3. foreach 标签可以把传入的集合对象进行遍历,然后把每一项的内容作为参数传到 sql 语句中
  4. include 可以把大量的重复代码整理起来,当使用的时候直接 include即可,减少重复代码的编写;
  5. 适用于更新中,当匹配某个条件后,才会对该字段进行跟新操作

七、谈一下你对 mybatis 缓存机制的理解?

Mybatis 有两级缓存,一级缓存是 SqlSession 级别的,默认开启,无法关闭;

二级缓存是 Mapper 级别的,二级缓存默认是没有开启的,但是手动开启

  1. 一级缓存:基础 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session, 当 Session flush 或 close 之后,Session 中的所有 Cache 就将清空
  2. 二级缓存其存储作用域为 Mapper(Namespace),使用二级缓存属性类需要实现 Serializable 序列化接口
  3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存 Namespaces) 的进行了 C(增加)/U(更新)/D(删除)操作后,默认该作用域下所有 select 中的缓存将被 clear. 需要在 setting 全局参数中配置开启二级缓存,如下 conf.xml 配置:

当我们的配置文件配置了 cacheEnabled=true 时,就会开启二级缓存,二级缓存是mapper 级别的,如果你配置了二级缓存,那么查询数据的顺序应该为:二级缓存→一级缓存→数据库

八、Mybatis是如何进行分页的?分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接拼写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页,比如:MySQL数据的时候,在原有SQL后面拼写limit。

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。