MyBatis-面试题

文章目录

    • 1.什么是MyBatis?
    • 2.#{}和${}的区别是什么?
    • 3.MyBatis的一级、二级缓存
    • 4.MyBatis的优缺点
    • 5.当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
    • 6.模糊查询like语句该怎么写?
    • 7.Mybatis是如何进行分页的?分页插件的原理是什么?
    • 8.如何执行批量插入?
    • 9.Mybatis动态sql有什么用?执行原理?有哪些动态sql?
    • 10.Mapper.xml除了常见的select|insert|updae|delete标签之外,还有哪些标签?
    • 11.MyBatis的XML映射文件中,不同的XML映射文件,id是否可以重复?
    • 12.为什么说MyBatis是半自动ORM映射框架?它与全自动的区别在哪里?
    • 13.MyBatis实现一对一有几种方式?具体怎么操作的?
    • 14.MyBatis实现一对多有几种方式,具体怎么操作的?
    • 15.MyBatis是否支持延迟加载?如果支持,它的实现原理是什么?
    • 16.什么是MyBatis的接口绑定?有哪些实现方式?
    • 17.使用MyBatis的Mapper接口调用时有哪些要求?
    • 18.简述MyBatis的插件运行原理,以及如何编写一个插件?

1.什么是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 的过程)。

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

1.#{}是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 23: …换。 2.Mybatis在处理#̲{}时,会将sql中的#{}替…{}时,就是把${}替换成变量的值。
4.使用#{}可以有效的防止SQL注入,提高系统安全性。

3.MyBatis的一级、二级缓存

Mybatis一级缓存(默认开启)
是SqlSession级别的缓存
默认开启
在这里插入图片描述

一级缓存清除方法
执行SqlSession的commit(执行插入、更新、删除操作后)
执行SqlSession的close方法
执行SqlSession的clearCache方法
映射文件XML中添加flushCache=“true”

Mybatis二级缓存(默认关闭,一般不建议使用)

  • namspace/mapper级别(跨sqlSession)的缓存
  • 默认不开启
  • 二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的,也就是要求实现- - Serializable接口。配置方法很简单,只需要在映射XML文件配置 就可以开启 二级缓存了
  • 二级缓存因为是跨sqlSession的,会存在严重的脏读问题 (脏读问题解释)
  • 二级缓存的弊大于利,一般是设置为关闭二级缓存
  • 实际开发中,会使用第三方来缓存,比如redis

二级缓存清除方法
映射文件XML中添加flushCache=“true”

4.MyBatis的优缺点

优点

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

缺点

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

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

第1种,通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
在这里插入图片描述

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

在这里插入图片描述

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

  1. 在Java代码中添加sql通配符。
    在这里插入图片描述

  2. 在sql语句中拼接通配符,会引起sql注入。
    在这里插入图片描述

  3. 使用bind动态标签拼接通配符,不会引起sql注入。

在这里插入图片描述

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

1.Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
2.分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。

8.如何执行批量插入?

  1. 使用MyBatis foreach动态sql
    在这里插入图片描述

在这里插入图片描述

  1. 使用Java代码

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

1.MyBatis的动态sql可以写在Mapper.xml内,以标签的形式编写动态sql,执行原理是根据表达式的值完成逻辑判断并动态拼接sql。
2.Mybatis 提供了 9 种动态 sql 标签:
trim | where | set | foreach | if | choose| when | otherwise | bind 。

10.Mapper.xml除了常见的select|insert|updae|delete标签之外,还有哪些标签?

1.、、、、,加上动态 sql 的 9 个标签,
2.其中 为 sql 片段标签,通过 标签引入 sql 片段, 为不支持自增的主键生成策略标签。

11.MyBatis的XML映射文件中,不同的XML映射文件,id是否可以重复?

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

12.为什么说MyBatis是半自动ORM映射框架?它与全自动的区别在哪里?

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

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

  1. 有联合查询和嵌套查询两种方式。
  2. 联合查询是几个表联合查询,只查询一次, 通过在标签里面配置标签配置一对一的类就可以完成。

SysUserMapper接口
在这里插入图片描述

SysUserMapper.xml
在这里插入图片描述

IdCardMapper.xml
在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

14.MyBatis实现一对多有几种方式,具体怎么操作的?

  1. 有联合查询和嵌套查询两种方式。
  2. 联合查询是几个表联合查询,只查询一次,通过在标签里面的标签配置一对多的类就可以完成。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

  1. Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。
  2. lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。
  3. aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods)。
  4. lazyLoadTriggerMethods:指定哪个对象的方法触发一次延迟加载。用逗号分隔的方法列表,默认执行下面方法就触发延迟加载:equals,clone,hashCode,toString。
  5. fetchType:为每一次查询决定是否延迟加载,可以覆盖lazyLoadingEnabled配置。lazy:延迟加载;eager:积极加载。

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

  1. 接口绑定,就是在 MyBatis 中任意定义接口,然后把接口里面的方法和 SQL 语句绑定, 我们直接调用接口方法就可以,这样比起原来了 SqlSession 提供的方法我们可以有更加灵活的选择和设置。
  2. 接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select、@Update 等注解,里面包含 Sql 语句来绑定。
  3. 另外一种就是通过 xml里面写 SQL 来绑定, 在这种情况下,要指定 xml 映射文件里面的 namespace 必须为接口的全路径名。当 Sql 语句比较简单时候,用注解绑定, 当 SQL 语句比较复杂时候,用 xml 绑定,一般用 xml 绑定的比较多。

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

  1. Mapper 接口方法名和 Mapper.xml 中定义的每个 sql 的 id 相同;
  2. Mapper 接口方法的输入参数类型和 Mapper.xml 中定义的每个 sql 的parameterType 的类型相同;
  3. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的resultType 的类型相同;
  4. Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径。

18.简述MyBatis的插件运行原理,以及如何编写一个插件?

  1. Mybatis 仅可以编写针对 ParameterHandler、ResultSetHandler、StatementHandler、Executor 这 4 种接口的插件,Mybatis 使用 JDK 的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是 InvocationHandler 的 invoke()方法,当然,只会拦截那些你指定需要拦截的方法。
  2. 编写插件:实现 Mybatis 的 Interceptor 接口并复写 intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,最后,需要在配置文件中配置你编写的插件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试之冰蝎实战

渗透测试之冰蝎实战1.基本使用2.命令执行&虚拟终端3.文件管理4.反弹shell5.内网资产扫描6.内网穿透7.数据库管理“冰蝎”是一款动态二进制加密网站管理客户端 下载地址 1.基本使用 运行冰蝎&#xff0c;打开传输协议&#xff1a; 生成一个php远程马&#xff1a; 点击生成…

【测试基础】之07 linux基础

Linux操作系统Linux操作系统介绍操作系统&#xff1a;管理计算机硬件与软件 资源的计算机程序&#xff0c;同时也是计算机系统的内核与基石。简单地说&#xff0c;操作系统就是出于用户与计算机系统硬件之间用于传递信息的系统程序软件。例如&#xff1a;操作系统会在接收到用户…

金三银四,你准备好面试了吗? (附30w字软件测试面试题总结)

不知不觉&#xff0c;已是3月下旬。最近有很多小伙伴都在跟我谈论春招面试的问题&#xff0c;其实对于面试&#xff0c;我也没有太多的经验&#xff0c;只能默默地把之前整理的软件测试面试题分享给Ta。今天就来大致的梳理一下软件测试的面试体系&#xff08;每一部分最后都有相…

Vue3学习笔记(5.0)

Vue.js循环语句 v-for指令需要以site in sites形式的特殊语法&#xff0c;sites是源数据数组并且site是数组元素迭代的别名。 v-for可以绑定数据到数组来渲染一个列表&#xff1a; <!--* Author: RealRoad1083425287qq.com* Date: 2023-03-26 16:26:51* LastEditors: Mei…

图解redis的client的实现

目录 1.引言 2.客户端属性 2.1套接字描述符 2.2 name 2.3 客户端标志 2.4输入缓冲区 2.5命令与命令参数 2.6命令实现的函数 2.7输出缓冲区 2.8身份验证 2.9 时间 3.客户端的创建的关闭 3.1普通客户端的创建 3.2普通客户端的关闭 3.AOF的伪客户端 1.引言 Redis服务…

(数字图像处理MATLAB+Python)第二章数字图像处理基础-第三、四节:数字图像的生成和数值描述

文章目录一&#xff1a;数字图像的生成与表示&#xff08;1&#xff09;图像信号的数字化&#xff08;2&#xff09;数字图像类型二&#xff1a;数字图像的数值描述&#xff08;1&#xff09;常用坐标系&#xff08;2&#xff09;数字图像的数据结构&#xff08;3&#xff09;常…

Typora使用

Typora Typora 是一款支持实时预览的 Markdown 文本编辑器。 1. 基础操作 1.1标题 # 一级标题## 二级标题### 三级标题#### 四级标题##### 五级标题###### 六级标题1.2 引用 > 引用内容1 > 引用内容2 >> 引用内容31.3 斜体 *斜体* _斜体_1.4 加粗…

mysql整理

文章目录概述SQLDDLDMLDQL单表查询多表查询DQL的执行顺序DCL管理用户控制权限函数约束事务存储引擎索引概述语法性能分析索引的使用SQL的优化insert优化主键优化Order by优化其它优化存储对象视图存储过程基本操作变量IF条件判断参数循环条件处理程序存储函数触发器锁全局锁表级…

Mysql-缓冲池 buffer pool

缓冲池 buffer pool innodb中的数据是以【页】的形式存储在磁盘上的表空间内&#xff0c;但是【磁盘的速度】和【内存】相比简直不值一提&#xff0c;而【内存的速度】和【cpu的速度】同样不可同日而语&#xff0c;对于数据库而言&#xff0c;I/O成本永远是不可忽略的一项成本…

基于Elman神经网络预测计费系统的输出(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 简单循环网络&#xff08;simple recurrent networks&#xff0c;简称SRN&#xff09;又称为Elman network&#xff0c;是由Jeff…

什么是AI文章生成器-AI文章生成器批量生成文章

AI文章生成器有哪些 目前市面上存在一些可以生成文章的 AI 文章生成器&#xff0c;以下是其中几种常见的&#xff1a; OpenAI GPT-3&#xff1a; OpenAI GPT-3 是目前最先进、最著名的 AI 文章生成器之一&#xff0c;它可以生成各种类型的文章&#xff0c;例如新闻报道、科学报…

我的Macbook pro使用体验

刚拿到Mac那一刻&#xff0c;第一眼很惊艳&#xff0c;不经眼前一亮&#xff0c;心想&#xff1a;这是一件艺术品&#xff0c;太好看了吧 而后再体验全新的Macos 系统&#xff0c;身为多年的win用户说实话一时间还是难以接受 1.从未见过的访达&#xff0c;不习惯的右键 2. …

[论文解析] Cones: Concept Neurons in Diffusion Models for Customized Generation

论文连接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId4731757617890738177&noteId1715361536274443520 源码链接&#xff1a; https://github.com/Johanan528/Cones 文章目录OverviewWhat problem is addressed in the paper?Is it a new problem? If so…

PMP一般要提前多久备考?

PMP很迷&#xff0c;有只备考了一周过的&#xff0c;也有备考几个月过的。保险起见&#xff0c;预留两个月比较靠谱&#xff0c;尤其现在是新考纲&#xff0c;PMP新版大纲加入了 ACP 敏捷管理的内容&#xff0c;而且还不少&#xff0c;敏捷混合题型占到了 50%&#xff0c;前不久…

AcWing3662. 最大上升子序列和(线性DP + 树状数组优化 + 离散化处理)

AcWing3662. 最大上升子序列和&#xff08;线性DP 树状数组优化 离散化处理&#xff09;一、问题二、分析1、DP过程&#xff08;1&#xff09;状态表示&#xff08;2&#xff09;状态转移2、数据结构优化&#xff08;1&#xff09;树状数组维护最值&#xff08;2&#xff09;…

K8s 弃用 Docker!一文介绍 containerd ctr、crictl 使用

containerd 是一个高级容器运行时&#xff0c;又名 容器管理器。简单来说&#xff0c;它是一个守护进程&#xff0c;在单个主机上管理完整的容器生命周期&#xff1a;创建、启动、停止容器、拉取和存储镜像、配置挂载、网络等。 containerd 旨在轻松嵌入到更大的系统中。Docke…

【ASPLOS 2023】图神经网络统一图算子抽象uGrapher,大幅提高计算性能

作者&#xff1a;周杨杰、沈雯婷 开篇 近日&#xff0c;阿里云机器学习平台PAI和上海交通大学冷静文老师团队合作的论文《图神经网络统一图算子抽象uGrapher》被ASPLOS 2023录取。 为了解决当前图神经网络中框架中不同的图算子在不同图数据上静态kernel的性能问题&#xff0…

【前沿技术】文心一言 PK Chat Gpt

目录 写在前面 一、文心一言 二、Chat GPT 三、对比 四、总结 写在前面 随着人工智能技术的不断发展和普及&#xff0c;越来越多的智能应用走入了人们的日常生活&#xff0c;如智能语音助手、智能客服、机器翻译等等。在这些应用中&#xff0c;自然语言生成&#xff08;…

看完不再愁 | 图解TCP 重传、滑动窗口、流量控制、拥塞控制

目录 前言 正文 &#x1f332; 重传机制 1. 超时重传 2. 快速重传 3. SACK 方法 4. Duplicate SACK &#x1f332; 滑动窗口 &#x1f333; 流量控制 &#x1f333; 拥塞控制 1. 慢启动 2. 拥塞避免算法 3. 拥塞发生 4. 快速恢复 前言 前面我们讲到「硬不硬你说…

Android开发一直在用大公司的开源库,可参考~

一、阿里巴巴 &#xff08;一&#xff09;UI有关 1. 多页面切换场景统一解决方案 UltraViewPager UltraViewPager 是阿里开源的一个封装多种特性的 ViewPager &#xff0c;主要是为多页面切换场景提供统一解决方案。 主要功能: 1. 支持横向滑动&#xff0f;纵向滑动2. 支持一屏…
最新文章