MyBatis八股文

news2025/2/1 6:59:01

1、什么是MyBatis框架?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射,它内部封装了jdbc,不需要我们再写JDBC连接、使开发者只需要关注sql语句本身和业务,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。直接通过配置文件或maven驱动包的方式加载导入就行。

工作原理
在这里插入图片描述

  1. 读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
  2. 加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 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 对结果集的解析过程。
    2、MyBatis的优点有哪些?
    1)Mybatis基于SQL语句编程,很灵活,不会有任何影响现有应用程序或数据库的设计,SQL编写的XML,删除SQL和程序代码的耦合,便于统一管理,提供了XML标记,使您能够编写动态SQL语句和重用它们。
    2)与JDBC相比,它减少了50%以上的代码量,消除了大量冗余的JDBC代码,不需要手动切换连接;
    3)与各种数据库的良好兼容性(因为MyBatis使用JDBC连接数据库,所以只要JDBC支持数据库MyBatis就支持)。
    4)与Spring和Spring MVC框架的良好集成;
    5)提供映射标签,支持对象与数据库ORM字段关系映射;提供对象关系映射标签,支持对象关系组件的维护。

3、#{}和KaTeX parse error: Expected 'EOF', got '#' at position 13: {}的区别是什么? 1)#̲{}是预编译处理,{}是字符串替换
2)Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;在处理时,会把{}替换成变量的值。使用#{}可以有效的防止SQL注入,提高系统安全性。
大家都知道Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和KaTeX parse error: Expected 'EOF', got '#' at position 12: {} 我们经常使用的是#̲{},一般解说是因为这种方式可…{}在动态解析时候,会传入参数字符串,这种传参就会出现sql注入的安全性问题。
select * from student where student_name = “1’ OR ‘1’='1”;

4、当实体类中的属性名和表中的字段名不一样,怎么处理?

select * from employees where id = #{id}
<!-- 自定义高级映射 -->
<resultMap type="com.tt.mybatis.entities.Employee" id="myMap">
	<!-- 映射主键 -->
	<id column="id" property="id"/>
	<!-- 映射其他列 -->
	<result column="last_name" property="lastName"/>
	<result column="email" property="email"/>
	<result column="salary" property="salary"/>
	<result column="dept_id" property="deptId"/>
</resultMap>
第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。 第二种是使用sql列的别名功能,将列的别名书写为对象属性名。 有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

5、模糊查询like语句该怎么写?
1、 “%”#{question}“%” 注意:因为#{…}解析成sql语句时候,会在变量外侧自动加单引号’ ',所以 这里 % 需要使用双引号" “,不能使用单引号 ’ ',不然会查不到任何结果。

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

2、CONCAT(’%’,#{question},’%’) 使用CONCAT()函数,(推荐)
6、MyBatis Dao层接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
举例说明: Dao接口就是Mapper接口,—可以基于注解的方式创建接口,接口内定义抽象方法;
public interface UserMapper {

@Select("select * from users where id=#{id}")
public User getUserById(int id);

}
接口的全限名,就是映射文件中的namespace的值:


select * from users where id=#{id}


Mapper接口没有实现类。当调用接口方法时,将接口名称+方法名称与字符串连接作为键值,以唯一定位MappedStatement。
在Mybatis中,每个select 、insert 、update、delete标记都被解析为一个MappedStatement对象。
Dao 接口即 Mapper 接口,接口的全限名,就是映射文件中的 namespace 的值;接口的方法名,就是映射文件中 Mapper 的 Statement 的 id 值;接口方法内的参数,就是传递给 sql 的参数。

关于重载和工作原理解释
1)Dao接口中的2个方法不能被覆盖,因为它是一个全名+方法名的保存和查找策略。
2)Dao接口的工作原理是JDK动态代理。mybatis会对每一个mapper代理生成一个mapperProxy对象,代理对象会拦截接口方法,转而自动对应到sqlsession上,最终由Executor执行。

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

8、MyBatis都有哪些Excutor执行器,它们之间的区别是什么?
Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
1)SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
2)ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。
3)BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

9、MyBatis动态sql有什么用?
Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值完成逻辑判断 并动态调整sql的功能。
Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind

10、JDBC有几个步骤
1、加载驱动程序
2、获得数据库连接
3、创建一个Statement对象操作数据库,实现增删改查
4、获取结果集
5、关闭资源

11、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,支持延迟加载的原理都是一样的。

12、MyBatis的一级、二级缓存?
1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;
3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。
详解请看:https://blog.csdn.net/java123456111/article/details/125005466
13、MyBatis中如何指定使用哪一种Executor执行器?
● 在MyBatis配置文件中,在设置(settings)可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数。 如 SqlSession openSession(ExecutorType execType)。
● 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。

14、在Mapper中如何传递多个参数
方法1:@Param注解传参法
public User selectUser(@Param(“userName”) String name, int @Param(“deptId”) deptId);

select * from user where user_name = #{userName} and dept_id = #{deptId}

● #{}里面的名称对应的是注解@Param括号里面修饰的名称。
● 这种方法在参数不多的情况还是比较直观的,(推荐使用)

方法2:Map传参法
public User selectUser(Map<String, Object> params);

select * from user where user_name = #{userName} and dept_id = #{deptId}

● #{}里面的名称对应的是Map里面的key名称
● 这种方法适合传递多个参数,且参数易变能灵活传递的情况。(推荐使用)

方法3:Java Bean传参法
public User selectUser(User user);

select * from user where user_name = #{userName} and dept_id = #{deptId}

● #{}里面的名称对应的是User类里面的成员属性 ;
● 这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑处理方 便,推荐使用。(推荐使用)。

15、如何获取生成的主键
● 新增标签中添加: keyProperty=" ID " 即可

insert into user( user_name, user_password, create_time)
values(#{userName}, #{userPassword} , #{createTime, jdbcType=TIMESTAMP})

16、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
● 第一种是使用标签,逐一定义列名和对象属性名之间的映射关系。
● 第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

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

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

相关文章

【数据结构】基础:常见排序算法

【数据结构】基础&#xff1a;常见排序算法 摘要&#xff1a;本文将从排序的概念及其附属概念出发&#xff0c;再对排序算法进行分类&#xff0c;并对其思想与实现进行说明&#xff0c;最后对各个算法进行总结。 文章目录【数据结构】基础&#xff1a;常见排序算法一. 排序的概…

K8s CRD 和 Operator 来进行 NebulaGraph 的部署

中间件及运维管理 我们基于 K8s CRD 和 Operator 来进行 NebulaGraph 的部署&#xff0c;同时通过服务集成到现有的部署配置页面和运维管理页面&#xff0c;来获得对 Pod 的执行和迁移的控制能力。基于 sidecar 模式监控、收集 NebulaGraph 的核心指标并通过 Telegraf 发送到携…

【第十四章 错误日志,二进制日志,查询日志,慢查询日志】

第十四章 第十四章 错误日志&#xff0c;二进制日志&#xff0c;查询日志&#xff0c;慢查询日志 1.错误日志&#xff1a; ①错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息…

Servlet还不会?那就看这篇文章吧

一. Servlet是什么? Servlet是Server Applet的简称&#xff0c;也就是服务程序。当然&#xff0c;杨哥习惯称它为"服务连接器"。 像上面这么说&#xff0c;大家可能会有所疑惑&#xff1a;什么是服务程序&#xff1f;可能有些人对这个还是不太懂&#xff0c;那么接下…

我国汽车配件行业需求空间较大 国产品牌配件市场份额逐渐提升

根据观研报告网发布的《2022年中国汽车配件行业分析报告-行业全景调研与发展战略咨询》显示&#xff0c;根据Markline全球汽车信息平台统计&#xff0c;2020年&#xff0c;全球整车市场产量规模约为7769.80万辆。对于整车厂而言&#xff0c;在委托上游制造商按照要求供应零部件…

软文营销对企业品牌推广的好处有哪些?

众所周知&#xff0c;互联网改变了我们的生活&#xff0c;他的横空出世一度改变我们的工作模式&#xff0c;又跟我们生活息息相关。如今&#xff0c;随着网络的深入发展&#xff0c;网络对企业的营销模式也产生了巨大的改变。其中网络软文营销成为了当下众多企业的主要营销手段…

Web漏洞扫描-Appscan安装配置及扫描

软件介绍 AppScan 是一种 Web 应用程序安全扫描工具&#xff0c;可帮助组织识别和修复其 Web 应用程序中的漏洞。它结合使用自动和手动测试技术来识别漏洞&#xff0c;例如跨站点脚本 (XSS)、SQL 注入和不安全的文件上传等。 AppScan 可用于在开发生命周期的不同阶段扫描 Web…

Unity 摄像机

摄像机分为两种 &#xff08;1&#xff09;透视摄像机 &#xff08;2&#xff09; 正交摄像机 一般3D游戏使用的透视多一点&#xff0c;2D游戏使用正交多一点。 相机参数 清除标记&#xff1a; &#xff08;1&#xff09;天空盒 &#xff08;2&#xff09;仅深度&#xff…

Problem J. Prime Game(数学 贡献)[2018-2019 ACM-ICPC, Asia Nanjing Regional Contest]

题目如下&#xff1a; 题解 or 思路 我们可以发现暴力去求解是无法完成的 O(n2)O(n^2)O(n2) 我们可以从贡献出发&#xff0c;计算每一个位置上的质因子所做的贡献 我们可以先通过分解质因子&#xff0c;记录每一个质因子的位置&#xff0c;在这里使用 vectorvectorvector 容器…

力扣(LeetCode)1760. 袋子里最少数目的球(C++/C)

二分查找 直观思维是对每个袋子进行分球操作&#xff0c;这样枚举似乎无从下手。逆向思维&#xff0c;从 111 开始&#xff0c;枚举袋子里球的最大数量&#xff0c;可以计算划分每个袋子需要的最小次数&#xff0c;通过最小次数之和&#xff0c;判断方案是否可行。由于从小到大…

python3安装PIL库的经历

前提&#xff1a;我是在电脑上同时装了python2和python3 两个环境。详见 Windows环境同时安装多个版本的Python解释器&#xff08;python2和python3&#xff09;&#xff08;超详细&#xff09;_落墨画雪的博客-CSDN博客_安装多个版本python 首先&#xff0c;PIL官方版不支持py…

程序员能干到退休吗?写了40年代码的「骨灰级码农」给出了15条建议

寒冬、裁员、降薪、996、秃头、最近几年这些词汇不断在各位码农的周围盘旋。 很多程序员对自己目前的状态干到困惑和焦虑&#xff0c;而且这好像是国内外程序们都会遇到的问题。 最近&#xff0c;在Reddit上&#xff0c;一位干了40年程序员的网友发表了对这一问题的看法&#x…

辛二酰苯胺异羟肟酸/葛根素/黄芩苷β-环糊精(β-CD)环糊精包合物/β环糊精二棕榈脂质体制备

这里给大家分享的科研内容是辛二酰苯胺异羟肟酸/葛根素/黄芩苷β-环糊精(β-CD)环糊精包合物/β环糊精二棕榈脂质体的制备&#xff0c;和小编一起来看&#xff01; 黄芩苷β-环糊精(β-CD)环糊精包合物脂质体制备方法&#xff1a; 采用傅里叶红外变换光谱法(FTIR)确认了黄芩苷…

工控CTF之协议分析4——MQTT

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、…

Appium基础 — Chrome Inspect定位工具

1、Chrome Inspect介绍 Chrome Inspect定位工具是用来抓取app中Webview页面的。 为了项目的需求&#xff0c;为了更好的保证效果和布局跨平台&#xff0c;Android&H5混合开发一般是我们不错的选择。Google浏览器中的Chrome Inspect定位工具&#xff0c;提供了一个移动端W…

(六)docker容器数据卷的理解和使用

目录 一、容器数据卷是什么 二、容器数据卷能干吗 三、宿主vs容器之间映射添加容器卷 四、读写规则映射添加说明 五、卷的继承和共享 一、容器数据卷是什么 Docker将运行的环境打包形成容器运行&#xff0c; Docker容器产生的数据&#xff0c;如果不通过docker commit生成…

【软件测试】快速迭代的敏捷项目?测试怎么做?测试人怎么提升自我价值......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 提到敏捷项目时&…

【嵌入式】Linux开发工具arm-linux-gcc安装及使用

知识架构及层次 — 程序编译及调试 嵌入式交叉编译器安装配置 宿主机 执行编译、链接嵌入式软件的计算机 目标机 运行嵌入式软件的硬件平台 “本地”编译器 用来生成在与编译器本身所在的计算机和操作系统&#xff08;平台&#xff09;相同的环境下运行的目标代码&#xff0c…

【2023 海光 笔试题】~ 题目及参考答案

文章目录1. 前言2. 题目 & 答案第1题第2题3. 回忆杀4. 关于存储芯片声明1. 前言 今天分享的是海光的关于IC验证的笔试部分题目&#xff01;&#xff01;&#xff01;名称如标题所示&#xff0c;希望大家正确食用&#xff08;点赞转发评论&#xff09; 本次笔试题一共三部分…

l2逐笔接口如何如何查询委托明细?

l2逐笔接口进出行查询逐笔委托明细目前只支持电脑端&#xff0c;需要在登录进页面后在个股分时页面的右边需要双击或回车操作&#xff0c;找到行情资讯单元&#xff0c;再选择Level2单元。并且l2逐笔接口对A股的数据调用就是利用api结构来验证和存储数据&#xff0c;相当于一个…