【MyBatis八股】MyBatis面试题

目录

    • MyBatis是什么?
    • Mybaits的优缺点?
    • 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
    • Hibernate 和 MyBatis 的区别?
    • JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
    • MyBatis编程步骤是什么样的?
    • #{}和${}的区别?
    • 通常一个XML映射文件,都会写一个Dao接口与之对应,那么这个Dao接口的工作原理是什么?Dao接口里的方法、参数不同时,方法能重载吗?
    • 在Mapper中如何传递多个参数?
    • Mybatis动态sql有什么用?执行原理是什么?有哪些动态sql?
    • xml映射文件中,不同的xml映射文件id是否可以重复?
    • Mybatis实现一对一有几种方式?具体是怎么操作的?
    • Mybatis实现一对多有几种方式?具体是怎么操作的?
    • Mybatis的一级、二级缓存是什么?
    • 使用MyBatis的Mapper接口调用时有哪些要求?

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 接口的类路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/48104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

serve : 无法将“serve”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

1、在学习webpack打包的时候&#xff0c;需要 serve用来启动开发服务器来部署代码查看效果的。安装完之后运行出现以下错误&#xff1a; 2、使用命令查看安装目录&#xff1a; npm list -g我们已经安装过了 3、解决&#xff1a; 我们看到上图路径在&#xff1a;C:\Users\qiy…

微信小程序使用npm引入三方包详解

目录 1 前言2 微信小程序npm环境搭建2.1 创建package.json文件2.2 修改 project.config.json2.3 修改project.private.config.json配置2.4 构建 npm 包2.5 typescript 支持2.6 安装组件2.7 引入使用组件 1 前言 从小程序基础库版本 2.2.1 或以上、及开发者工具 1.02.1808300 或…

【PACS源码】认识PACS的架构和工作流程

&#xff08;一&#xff09;PACS系统的组成及架构 PACS系统的基本组成部分包括&#xff1a;数字影像采集、通讯和网络、医学影像存储、医学影像管理、各类工作站五个部分。 而目前PACS系统的软件架构选型上看&#xff0c;主要有C/S和B/S两种形式。 C/S架构&#xff0c;即Client…

Unity 变量修饰符 之protected ,internal,const , readonly, static

文章目录 protectedinternalconstreadonlystatic protected 当在Unity中使用C#编程时&#xff0c;protected是一种访问修饰符&#xff0c;用于控制类成员&#xff08;字段、方法、属性等&#xff09;的可见性和访问权限。protected修饰的成员可以在当前类内部、派生类&#xf…

构造函数内的方法 直接写在构造函数内部 与 写在prototype上 的区别

文章目录 前言区别总结 前言 以前没注意过, 去创建一个构造函数的时候, 方法都是直接写在函数内的. 在构造函数需要多次实例化的情况下有缺点, 不过幸好以前项目里的构造函数也不需要多次实例化, 缺点没有生效. 区别 为了比较, 先在构造函数内部直接书写方法, 查看实例化结果…

EasyExcel工具 Java导出Excel表数据

EasyExcel 优点坐标依赖读Excel最简单的读的对象写Excel最简单的写的对象最简单的读的监听器填充Excel简单填充(对象)复杂填充(对象和列表)官网:https://easyexcel.opensource.alibaba.com/ EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。…

使用ChatGPT进行创意写作的缺点

Open AI警告ChatGPT的使用者要明白此工具的局限性&#xff0c;更不应完全依赖。作为一位创作者&#xff0c;这一点非常重要&#xff0c;应尽可能地避免让版权问题或不必要的文体问题出现在自己的作品中。[1] 毕竟使用ChatGPT进行创意写作目前还有以下种种局限或缺点[2]&#xf…

Nginx高可用集群

目录 一.简介二.案例1.实现思路2.配置文件修改3.实现效果故障转移机制 一.简介 以提高应用系统的可靠性&#xff0c;尽可能地减少中断时间为目标&#xff0c;确保服务的连续性&#xff0c;达到高可用的容错效果。例如“故障切换”、“双机热备”、“多机热备”等都属于高可用集…

识别变速箱油封泄漏的症状

变速箱是车辆和机械中的关键部件&#xff0c;负责将动力从发动机传输到车轮或其他机械部件。适当的润滑对于确保平稳运行和使用寿命至关重要。因此&#xff0c;变速箱油封泄漏可能会损害这种润滑并导致各种问题。了解此类泄漏的症状对于及时检测和维护至关重要。 变速箱油封重…

蓝凌OA custom.jsp 任意文件读取

​曾子曰&#xff1a;“慎终追远&#xff0c;民德归厚矣。” 漏洞复现 访问漏洞url&#xff1a; 出现漏洞的文件为 custom.jsp&#xff0c;构造payload&#xff1a; /sys/ui/extend/varkind/custom.jsp var{"body":{"file":"file:///etc/passwd&q…

圆的反演 hdu 6097

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 题目大意 http://acm.hdu.edu.cn/showproblem.php?pid6097 有一个圆C&#xff0c;它的圆心是O(0,0), 半径是r。 在C内部或边界上有两点P和Q&#xff0c;OPOQ。 求解…

软考高级架构师下篇-12层次式架构设计理论与实践

目录 1. 考情分析2. 层次式体系结构概述3. 表现层框架设计4. 中间层框架设计5. 数据访问层设计6. 数据架构规划与设计7. 物联网层次架构设计8. 前文回顾1. 考情分析 根据考试大纲,层次式架构设计理论与实践知识点会涉及单选题型(约占2~5分)和案例题(25分),本小时内容偏重于方…

三分钟解决AE缓存预览渲染错误、暂停、卡顿问题

一、清除RAM缓存&#xff08;内存&#xff09; 你应该做的第一件事是清除你的RAM。这将清除当前存储在内存中的所有临时缓存文件。要执行此操作&#xff0c;请导航到编辑>清除>所有内存。这将从头开始重置RAM缓存 二、清空磁盘缓存 您也可以尝试清空磁盘缓存。执行此操作…

实现chatGPT 聊天样式

效果图 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Chat Example</title&g…

SpringBoot解决mysql 连接8小时问题

SpringBoot解决mysql 连接8小时问题 问题&#xff1a; 服务连接mysql数据库&#xff0c;8小时没有数据库的操作时候&#xff0c;数据库会主动断开连接释放资源 解决办法总共4种方法 MySQL 5版本之前可以通过在URL后面加入autoReconnecttrue application.properties文件中加入…

第6天----【位运算进阶之-----位与()】七夕特别版

今天我们来学习C语言的位与。 ❤️C语言的位与&#xff08;&&#xff09;操作是一种按位运算符&#xff0c;用于对两个操作数的每个对应位执行逻辑与操作。它的操作规则如下&#xff1a; 如果两个操作数的对应位都为1&#xff0c;则结果的对应位也为1。&#xff08;全1才…

【Cadence】差分管噪声贡献差别很大的可能原因

举例&#xff1a;M2 M3是一对差分管&#xff0c;噪声贡献差别很大。 理想电感下二者贡献相同&#xff0c; 但在实际电磁仿真后&#xff0c;一个17.6%&#xff0c;一个5.6% 原因是&#xff1a; 电磁仿真存在交叉&#xff0c;不对称&#xff0c;中心抽头不是理想的交流地&#x…

初识C语言

目录 一、C语言的概念 二、第一个C语言程序 三、数据类型 四、变量和常量 4.1 变量定义方法 4.2 变量的命名 4.3 变量的分类 4.4 变量的作用域和生命周期 4.5 常量 五、字符串和转义字符 5.1 字符串 5.2 转义字符 六、注释 七、选择语句 八、循环语句 九、函数 十、数…

如何使用CSS实现一个全屏滚动效果(Fullpage Scroll)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现全屏滚动效果的CSS和JavaScript示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦…

node_modules.cache是什么东西

一开始没明白这是啥玩意&#xff0c;还以为是npm的属性&#xff0c;网上也没说过具体的来源出处 .cache文件的产生是由webpack4的插件cache-loader生成的&#xff0c;node_modules里下载了cache-loader插件&#xff0c;很多朋友都是vuecli工具生成的项目&#xff0c;内置了这部…