【MyBatis八股】MyBatis面试题

目录

MyBatis是什么?

  • Mybatis是一个半 ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建 statement 等繁杂的过程,开发者开发时只需要关注如何编写 SQL 语句,可以严格控制 SQL 执行性能,灵活度高。
  • 作为一个半 ORM 框架,MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
  • 通过 XML 文件或注解的方式将要执行的各种 statement 配置起来,并通过 Java 对象和 statement 中 SQL 的动态参数进行映射生成最终执行的 SQL 语句,最后由 Mybatis 框架执行 SQL 并将结果映射为 Java对象并返回。(从执行SQL到返回 result 的过程)。
  • 由于MyBatis专注于SQL本身,灵活度高,所以比较适合对性能的要求很高,或者需求变化较多的项目,如互联网项目。

Mybaits的优缺点?

优点:

  • 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
  • 与 JDBC 相比,减少了50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;
  • 很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要 JDBC 支持的数据库 MyBatis 都支持)。
  • 能够与 Spring 很好的集成;
  • 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

缺点:

  • SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
  • SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

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

Hibernate 属于全自动ORM映射工具 ,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。

Mybatis 在查询关联对象或关联集合对象时,需要手动编写 SQL 来完成,所以,称之为半自动ORM映射工具。

Hibernate 和 MyBatis 的区别?

相同点:都是对 Jdbc 的封装,都是持久层的框架,都用于 Dao 层的开发。

不同点

  • 映射关系

    MyBatis 是一个半自动 映射的框架,配置 Java 对象与 SQL 语句执行结果的对应关系,多表关联关系配置简单。

    Hibernate 是一个全表映射的框架,配置 Java 对象与数据库表的对应关系,多表关联关系配置复杂。

  • SQL优化和移植性

    Hibernate 对 SQL 语句封装,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供 HQL(Hibernate Query Language)操作数据库,数据库无关性支持好,但会多消耗性能。如果项目需要支持多种数据库,代码开发量少,但SQL语句优化困难。

    MyBatis 需要手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。开发工作量相对大些。直接使用SQL语句操作数据库,不支持数据库无关性,但 SQL 语句优化容易。

  • 开发难易程度和学习成本

    Hibernate 是重量级框架,学习使用门槛高,适合于需求相对稳定,中小型的项目,比如:办公自动化系统。MyBatis 是轻量级框架,学习使用门槛低,适合于需求变化频繁,大型的项目,比如:互联网电子商务系统。

总结:MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。

JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

2、SQL 语句写在代码中造成代码不易维护,实际应用 SQL 变化的可能较大,SQL 变动需要改变 Java代码。

解决:将 SQL 语句配置在XXXXmapper.xml文件中与 Java 代码分离。

3、 向 SQL 语句传参数麻烦,因为 SQL 语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

解决: Mybatis自动将 Java对象映射至 SQL 语句。

4、 对结果集解析麻烦,SQL 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 POJO 对象解析比较方便。

解决:Mybatis自动将 SQL 执行结果映射至 Java 对象。

MyBatis编程步骤是什么样的?

  • 1、创建 SqlSessionFactory
  • 2、通过 SqlSessionFactory 创建SqlSession
  • 3、 通过 sqlsession 执行数据库操作
  • 4、 调用 session.commit() 提交事务
  • 5、 调用 session.close() 关闭会话

#{}和${}的区别?

【MyBatis占位符】Mybatis中的#{}和${}区别

通常一个XML映射文件,都会写一个Dao接口与之对应,那么这个Dao接口的工作原理是什么?Dao接口里的方法、参数不同时,方法能重载吗?

Dao 接口即 Mapper 接口。接口的全限名就是映射文件中的 namespace 的值;

接口的方法名,就是映射文件中 Mapper 的 Statement 的 id 值;

接口方法内的参数,就是传递给 SQL 的参数。

Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名的拼接字符串作为 key 值,可唯一定位一个MapperStatement。

Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

Dao接口的工作原理是 JDK动态代理,Mybatis 运行时会使用 JDK 动态代理为 Dao 接口生成代理 proxy 对象,代理对象 proxy 会拦截接口方法,转而执行 MappedStatement 所代表的 SQL ,然后将 SQL 执行结果返回。

在Mapper中如何传递多个参数?

  • 若Dao 层函数有多个参数,那么其对应的XML中,#{0}代表接收的是 Dao 层中的第一个参数,#{1}代表 Dao 中的第二个参数,以此类推。

  • 使用@Param注解:在Dao层的参数中前加@Param注解,注解内的参数名为传递到Mapper中的参数名。

  • 多个参数封装成Map,以 HashMap 的形式传递到 Mapper 中。

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

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

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

其执行原理为,使用 OGNL(Object Graph Navigation Language) 从 SQL 参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

xml映射文件中,不同的xml映射文件id是否可以重复?

不同的XML映射文件,如果配置了namespace,那么 id 可以重复;如果没有配置 namespace,那么 id 不能重复;

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

Mybatis实现一对一有几种方式?具体是怎么操作的?

有联合查询和嵌套查询两种方式。

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

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

Mybatis实现一对多有几种方式?具体是怎么操作的?

有联合查询和嵌套查询两种方式。

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

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

Mybatis的一级、二级缓存是什么?

  • 1、 一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
  • 2、 二级缓存与一级缓存机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态),可在它的映射文件中配置。

对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存 Namespace)进行了增/删/改操作后,默认该作用域下所有 select 中的缓存将被 clear。

使用MyBatis的Mapper接口调用时有哪些要求?

  • 1、Mapper接口方法名和 mapper.xml 中定义的每个 SQ L的 id 相同;
  • 2、Mapper接口方法的输入参数类型和 mapper.xml 中定义的每个 SQL 的 parameterType 类型相同;
  • 3、Mapper接口方法的输出参数类型和 mapper.xml 中定义的每个 SQL 的 resultType 的类型相同;
  • 4、Mapper.xml文件中的 namespace 即是 mapper 接口的类路径。
相关推荐
齐 飞5 小时前
idea中git误操作撤回git reset --hard ‘HEAD@{1}‘
java·git·intellij-idea
你的保护色5 小时前
多AS互联BGP4综合实验设计
java
某不知名網友5 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
Wang's Blog6 小时前
Java 项目实战: 交友项目 - MongoDB 入门:体系结构和命令行操作
java·mongodb·交友
小溪学编程6 小时前
将 Bean 放入 Spring 容器中的方式有哪些?
java·后端·spring
java_nnnn6 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
用户3721574261356 小时前
Java 读取、修改和清空 PDF 文档属性(元数据)
java
SL_staff6 小时前
从‘改一行代码等三天’到‘改完即生效’:实施工程师的逻辑引擎避坑手记
java·产品·全栈
小羊没烦恼!6 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
hhwyqwqhhwy6 小时前
设备树之 provider 和 consumer
java·linux·前端