MyBatis面试题

devtools/2024/10/17 23:25:08/

1. 什么是MyBatis

MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或者注解用于配制和原始映射,将接口和Java的POJOS映射成数据库中的记录。

2. MyBatis工作原理

  1. 读取MyBatis配置文件mybatis-config.xml为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,例如数据库连接信息。
  2. 加载映射文件:映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在mybatis-config.xml中加载,mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中的一张表。
  3. 构造会话工厂:通过mybatis环境配置信息构建会话工厂sqlSessionFactory。
  4. 创建会话对象:由会话工厂创建sqlSession对象,该对象中包含了执行sql语句的所有方法
  5. Executor执行器:MyBatis底层定义了一个Executor接口来操作数据库,他将根据sqlsession传递的参数动态的生成需要执行的sql语句,同时负责查询缓存的维护。
  6. MappedStatement对象:在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的sql语句的Id、参数等信息。
  7. 输入参数映射:输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO、输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
  8. 输出结果映射:输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对于结果集的解析过程。

3. Mybatyis和hibernate的区别有哪些

  1. MyBatis和Hibernate不同,他不完全是一个ORM框架,因为MyBatis需要程序员自己编写SQL语句。
  2. MyBatis直接编写原生态SQL,可以严格控制SQL执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发。因为这类软件需求变化频繁,一旦需求变化要求迅速输出成果。但是MyBatis无法做到数据库无关性,如果要实现支持多种数据库的软件,则需要自定义多套SQL映射文件,工作量大。
  3. Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用Hibernate开发可以省很多代码。

4. 什么是DAO模式

DAO是一个为数据库或者其他持久化机制提供了抽象接口的对象。在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中。用程序设计语言来说,就是抽象一个接口,接口中定义了此应用程序将会用到的所有事务方法。DAO模式,实际包含了两个模式,一个是Data Accessor(数据访问起),另一个是Data Object(数据对象)。前者解决如何访问数据的问题,后者解决如何用对象封装数据。

5. MyBatis中#{}和${}区别

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

  • MyBatis在处理#{}时,会将SQL中的#{}替换为?号,调用preparedStatement的set方法来赋值。
  • MyBatis在处理$ {}时,就是把$ {}替换成变量的值
  • 使用#{}可以有效的防止SQL注入,提高系统安全性,原因在于:预编译机制

预编译是提前对SQL语句进行预编译,而其后注入的参数将不会在进行SQL编译。SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入,预编译完成后,SQL的结构已经固定,即便用户输入非法参数,也不会对SQL的结构产生影响,从而避免了潜在的安全风险。

6. MyBatis有几种分页方式

  1. 数组分页
  2. SQL分页
  3. 拦截器分页
  4. RowBounds分页

7. MyBatis逻辑分页和物理分页的区别是什么

逻辑分页 是一次性查询很多数据,然后在结果中检索分页的数据。这样做的弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。
物理分页 是从数据库查询指定条数的数据,弥补了一次性全部查出所有数据的种种缺点,比如需要大量的内存,对数据库查询压力较大等问题。
物理分页总是优于逻辑分页:没有必要将属于数据库端的压力加诸到应用端,就算速度上存在优势,然而其他性能上的优点足以弥补这个缺点。

8. MyBatis是如何进行分页的,分页插件的原理是什么

MyBatis使用RowBounds对象进行分页,他是针对ResultSet结果集执行的内存分页,而非物理分页。分页插件的基本原理是使用MyBatis提供的插件接口,实现自定义插件,在 插件的拦截方法内拦截待执行的SQL,然后重写SQL,添加对应的物理分页语句和物理分页参数。
例如:select * from student;拦截后,sql重写为:select t.* from ( select * from student) t limit 0,10

9. RowBounds是一次性查询全部结果吗

RowBounds表面上是在【所有】数据中检索数据,其实并非一次性查询出所有数据,因为MyBatis是对JDBC的封装,在JDBC的驱动中有一个fetch size的配置,他规定了每次最多从数据库查询多少条数据。假如,要查询更多的数据,会在你执行next的时候,去查询更多的数据。

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

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

http://www.ppmy.cn/devtools/118191.html

相关文章

重头开始嵌入式第四十四天(硬件 ARM裸机开发)

目录 裸机开发 一、开发背景 二、开发特点 三、开发流程 四、应用领域 使用的软件硬件 软件:keil 硬件:三星S3C2440A JTAG 开发原理 ​编辑 开发步骤 ​编辑 点亮小灯 按键控制亮灭 裸机开发 ARM 裸机开发是指在没有操作系统的情况…

Request 原理

目录 request原理 Request继承体系 ​编辑Request获取请求行数据方法介绍 1、获取请求行数据 2、获取请求头数据 3、获取请求体数据 4、其他功能 1、获取请求参数通用方式: 中文乱码问题: 2.请求转发 3.共享数据 4.获取servletcontext reques…

不可思议的转折,这部韩剧在口碑上实现逆袭

今天,推荐一下韩国版的《纸钞屋》,第一季豆瓣从9.4分滑到6.9分。第二季的回归却让这部剧迎来了“翻身仗”,目前豆瓣已飙升至8.4。 对比第一季,第二季不仅在剧情反转和人物刻画上有了明显的提升,还引入了《黑暗荣耀》中…

系统架构设计师教程 第10章 10.1 软件架构演化和定义的关系 笔记

10.1 软件架构演化和定义的关系 ★★★☆☆ 10.1.1 演化的重要性 软件架构的演化就是软件整体结构的演化,演化过程涵盖软件架构的全生命周期,包括软件架构需求的获取、软件架构建模、软件架构文档、软件架构实现以及软件架构维护等阶段。 首先&#x…

【UI自动化】Web自动化框架

系列文章目录 【UI自动化】前言 【UI自动化】Web自动化框架 文章目录 系列文章目录前言一、Selenium是什么?二、Selenium包含的小工具1.Selenium IDE2.Selenium Grid3.WebDriver 三、Web自动化环境搭建总结 前言 Web自动化测试工具有很多,比如Selenium…

【系统架构设计师】专业英语90题(附答案详解)

更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【第1~5题】【第6~10题】【第11~15题】【第16~20题】【第21~25题】【第26~30题】【第31~35题】【第36~40题】【第41~45题】【第46~50题】【第51~55题】【第56~60题】【第61~65题】【第66~70题】【第71~75题】【第76~8…

【C++】检测TCP链接超时——时间轮组件设计

目录 引言 时间轮思想 设计的核心思路 完整代码 组件接口 个人主页:东洛的克莱斯韦克-CSDN博客 引言 对于高并发的服务器来说,链接是一种比较珍贵的资源,对不活跃的链接应该及时释放。判断连接是否活跃的策略是——在给定的时间内&#…

从拥堵到畅通:HTTP/2 如何解决 Web 性能瓶颈?

HTTP/2 相比 HTTP/1.1 引入了许多改进,旨在提高 Web 传输性能和用户体验。HTTP/1.1 存在的问题主要包括高延迟、头部阻塞、连接复用效率低等问题。HTTP/2 通过一系列的技术提升,解决了这些问题。我们来详细讲解从 HTTP/1.1 到 HTTP/2 的主要改进。 一、…