备战2020春招,这次彻底搞懂MyBatis,这些面试题没白刷(附答案)

前言:

春招面试题MyBatis篇来咯!!!

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

最近有好多朋友在准备春招,所以小编也会多出一些面试专题的文章给有需要的人,所以记得给我点个关注哦

image.png


一.MyBatis 框架的缺点:


1、SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写

SQL 语句的功底有一定要求。

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


二.MyBatis 框架适用场合:


1、MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。

2、对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是

不错的选择。


三.MyBatis 与 Hibernate 有哪些不同?


1、Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要

程序员自己编写 Sql 语句。

2、Mybatis 直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高,非常

适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需

求变化要求迅速输出成果。但是灵活的前提是 mybatis 无法做到数据库无关性,

如果需要实现支持多种数据库的软件,则需要自定义多套 sql 映射文件,工作量大。

3、Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的

软件,如果用 hibernate 开发可以节省很多代码,提高效率。


四.#{}和${}的区别是什么?

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

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

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

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


五.模糊查询 like 语句该怎么写?


第 1 种:在 Java 代码中添加 sql 通配符。

string wildcardname = “%smi%”;

list<name> names = mapper.selectlike(wildcardname);


<select id=”selectlike”>

select * from foo where bar like #{value}

</select>


第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入

string wildcardname = “smi”;

list<name> names = mapper.selectlike(wildcardname);

<select id=”selectlike”>

select * from foo where bar like "%"#{value}"%"

</select>


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

Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

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


七.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?


第一种是使用<resultMap>标签,逐一定义数据库列名和对象属性名之间的映射关系。

第二种是使用 sql 列的别名功能,将列的别名书写为对象属性名。

有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值返回,那些找不到映射关系的属性,是无法完成赋值的。


.如何获取自动生成的(主)键值?


insert 方法总是返回一个 int 值 ,这个值代表的是插入的行数。

如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。

示例:

<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”

id”>

insert into names (name) values (#{name})

</insert>

name name = new name();

name.setname(“fred”);

int rows = mapper.insertname(name);

// 完成后,id 已经被设置到对象中

system.out.println(“rows inserted = ” + rows);

system.out.println(“generated key value = ” + name.getid());


九.Mybatis 动态 sql 有什么用?执行原理?有哪些动态 sql?


Mybatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接 sql 的功能。

Mybatis 提供了 9 种动态 sql 标签:trim | where | set | foreach | if | choose| when | otherwise | bind。


十.Xml 映射文件中,除了常见的 select|insert|updae|delete标签之外,还有哪些标签?


<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>,加上动态 sql 的 9 个标签,其中<sql>为 sql 片段标签,通过<include>标签引入 sql 片段,<selectKey>为不支持自增的主键生成策略标签。


十一.Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?


不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复;如果没有配置 namespace,那么 id 不能重复;原因就是 namespace+id 是作为 Map<String, MapperStatement>的 key使用的,如果没有 namespace,就剩下 id,那么,id 重复会导致数据互相覆盖。有了 namespace,自然 id 就可以重复,namespace 不同,namespace+id 自然也就不同。


十二.为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 Mybatis在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动 ORM 映射工具。


十三.MyBatis 实现一对一有几种方式?具体怎么操作的?

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap 里面配置 association 节点配置一对一的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的结果的 外键 id,去再另外一个表里面查询数据,也是通过 association 配置,但另外一个表的查询通过 select 属性配置。


十四.MyBatis 实现一对多有几种方式,怎么操作的?

有联合查询和嵌套查询。联合查询是几个表联合查询,只查询一次,通过在resultMap 里面的 collection 节点配置一对多的类就可以完成;嵌套查询是先查一个表,根据这个表里面的 结果的外键 id,去再另外一个表里面查询数据,也是通过配置 collection,但另外一个表的查询通过 select 节点配置。


十五.Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。

它的原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。这就是延迟加载的基本原理。当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都是一样的。


十六.什么是 MyBatis 的接口绑定?有哪些实现方式?

十七.使用 MyBatis 的 mapper 接口调用时有哪些要求?

十八.Mybatis 的一级、二级缓存:

十九.Mapper 编写有哪几种方式?

二十.简述 Mybatis 的插件运行原理,以及如何编写一个插件。

二十一.为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

二十二.一对一、一对多的关联查询 ?

二十三.MyBatis 与 Hibernate 有哪些不同?


读者福利:

这些面试题是我收集整理的一份千道面试题文档里面,分享了一小部分给大家,要拿到自己想要的offer,首先要有准备的去面试,其次就是要有过硬的知识。这份PDF面试资料包含了各大Java核心知识的面试,都带详细的解答,分享给有需要的人

领取方式:关注我的供种浩(Java周某人)即可免费领取

包含知识:

  • MyBatis 面试题(27题)

  • ZooKeeper 面试题(28题)

  • Dubbo 面试题(30题)

  • Elasticsearch 面试题(24题)

  • Memcached 面试题(23题)

  • Redis 面试题(40题)

  • MySQL 面试题(50题)

  • Java 并发编程(一),Java 并发编程(二)(共123题)

  • Java 面试题(一),Java 面试题(二)(共228题)

  • Spring 面试题(一),Spring 面试题(二)(共116题)

  • 微服务面试题(50题)

  • Linux 面试题(45题)

  • Spring Boot 面试题(22题)

  • Spring Cloud 面试题(8题)

  • RabbitMQ 面试题(12题)

  • kafka 面试题(18题)


备战2020春招,这次彻底搞懂MyBatis,这些面试题没白刷(附答案)



备战2020春招,这次彻底搞懂MyBatis,这些面试题没白刷(附答案)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章