Mybatis八股

news2024/12/25 10:24:21

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本身,灵活度高,所以比较适合对性能的要求很高,或者需求变化较多的项目,如互联网项目。

Mybatis优缺点

优点

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

缺点

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

Mybatis与Hibernate有哪些不同?

  1. Mybatis不是完全的ORM框架,需要程序员自己编写Sql语句,灵活性高,适合对关系数据模型要求不高的软件开发。
  2. Mybatis无法做到是数据无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件;Hibernate对象/关系映射能力强,有较好的数据无关性。

#{}${}的区别

  • ${}是变量占位符,可以用于标签属性值和sql内部,属于原样文本替换,可以替换任何内容。
select * from users order by ${orderCols}
  • #{}是 sql 的参数占位符,MyBatis 会将 sql 中的#{}替换为? 号,在 sql 执行前会使用 PreparedStatement 的参数设置方法,按序给 sql 的? 号占位符设置参数值,比如 ps.setInt(0, parameterValue)#{item.name} 的取值方式为使用反射从参数对象中获取 item 对象的 name 属性值,相当于 param.getItem().getName()

Mybatis执行流程

  1. 加载Mybatis配置文件: mybatis-config.xml加载运行环境和映射文件
  2. 构造会话工厂SqlSessionFactory
  3. 会话工厂创建SqlSession对象(包含执行SQL语句的所有方法)
  4. Executor操作数据库的接口,同时负责查询缓存的维护
  5. Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息
  6. 输入参数映射
  7. 输出结果映射
    在这里插入图片描述

Mybatis是否支持延迟加载

Mybatis支持延迟加载,但默认没有开启

  • 延迟加载意思是:需要用到数据时才进行加载,不需要用到数据就不加载数据
  • Mybatis中支持一对一关联对象和一对多关联集合对象的延迟加载
  • 在Mybatis配置文件中,可以配置是否采用延迟加载lazyLoadingEnabled=true|false

何为延迟加载

  1. 使用CGLIB创建目标对象的代理对象
  2. 当调用目标方法user.getOrderList()时,进入拦截器invoke方法,发现user.getOrderList()是null值,执行sql查询order列表
  3. 查询到order后,调用user.setOrderList(List orderList),利用set方法设置属性值,在继续查询目标方法,完成user.getOrderList()的方法调用。

Mybatis的一级、二级缓存

  • 一级缓存:基于PerpetualCache的HashMap本地缓存,其作用域为Session。当Session进行Flush或者Close之后,该Session中所有的Cache就将清空,默认打开一级缓存。
  • 二级缓存是基于namespace和mapper的作用域起作用,不依赖于SQL session,默认也是采用Perpetual,HashMap存储。需要单独开启。一个是在核心配置中改为True,一个是在mapper映射文件中添加’\cache’标识。

Mybatis的二级缓存什么时候回清理缓存中的数据

当某一个作用域(一级缓存Session/二级缓存Namespaces)进行了增删改操作后,默认该作用域下所有select中的缓存都将被删除。

Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?

Dao接口,即Mapper接口,通常每个xml映射文件都会有一个Dao接口与之对应。接口的权限名就是映射文件中namespace的值;接口的方法名即为MappedStatement的id值;接口方法内的参数就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,将接口权限名+方法名拼接字符串作为key值,可以定位一个MappedStatement

举例:com.mybatis3.mappers. StudentDao.findStudentById,可以唯一找到 namespacecom.mybatis3.mappers. StudentDao 下面 id = findStudentByIdMappedStatement 。在 MyBatis 中,每一个 <select><insert><update><delete> 标签,都会被解析为一个 MappedStatement 对象。

Mybatis 的 Dao 接口可以有多个重载方法,但是多个接口对应的映射必须只有一个,否则启动会报错。

在Mapper中如何传递多个参数

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

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

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

Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理吗?

MyBatis 动态 sql 可以让我们在 xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。其执行原理为,使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。

提供了9种动态sql标签

  • <if></if>
  • <where></where>(trim,set)
  • <choose></choose>(when, otherwise)
  • <foreach></foreach>
  • <bind/>

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

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

相关文章

学成在线-生成扫码下单接口的二维码同时创建创建商品订单记录和交易支付记录

生成下单接口二维码 界面原型 打开课程支付引导界面&#xff0c;点击支付宝支付按钮商户系统生成下单的二维码接口&#xff0c;用户扫描二维码后商户系统开始请求支付宝下单 用户扫码开始请求支付宝下单&#xff0c;但是在生成下单接口的二维码前前端需要做一些操作 前端调用…

vue项目因内存溢出启动报错

前端能正常启动&#xff0c;但只要一改动就报错启动出错。 解决办法&#xff1a; 安装依赖 npm install cross-env increase-memory-limit 然后再做两件事&#xff1a;在node 在package.json 里的 script 里进行配置 LIMIT是你想分配的内存大小&#xff0c;这里的8192单位…

手势学习

1. 点击手势 Composable fun ClickableSample() {val number remember {mutableStateOf(0)}Text(text number.value.toString(),textAlign TextAlign.Center,modifier Modifier.wrapContentSize().clickable {number.value}.background(Color.LightGray).padding(horizonta…

UE5.2 SmartObject使用实践

SmartObject是UE5新出的一项针对AI的功能&#xff0c;可为开发者提供如公园长椅、货摊等交互对象的统一外观封装&#xff0c;如UE的CitySample&#xff08;黑客帝国Demo&#xff09;中就运用到了SmartObject。 但SmartObject实践起来较为繁琐&#xff0c;主要依赖于AI及行为树…

python爬虫(9)之requests模块

1、获取动态加载的数据 1、在开发者工具中查看动态数据 找到csdn的门户的开发者工具后到这一页面。 2、加载代码 import requests headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36…

iOS17.4获取UDID安装mobileconfig描述文件失败 提示“安全延迟进行中”问题 | 失窃设备保护

iOS17.4这两天已经正式发布&#xff0c; 在iOS 17.4版本中新增了一个名为"失窃设备保护"的功能&#xff0c;并提供了一个"需要安全延迟"的选项。 iOS17.4获取UDID安装mobileconfig描述文件失败 提示“安全延迟进行中”问题 | 失窃设备保护 当用户选择启用…

#LLM入门|Prompt#2.8_搭建一个带评估的端到端问答系统

在这一章节中&#xff0c;我们将会构建一个集成评估环节的完整问答系统。这个系统将会融合我们在前几节课中所学到的知识&#xff0c;并且加入了评估步骤。以下是该系统的核心操作流程&#xff1a; 对用户的输入进行检验&#xff0c;验证其是否可以通过审核 API 的标准。若输入…

植物病虫害:YOLO玉米病虫害识别数据集

玉米病虫害识别数据集&#xff1a;玉米枯萎病&#xff0c;玉米灰斑病&#xff0c;玉米锈病叶&#xff0c;粘虫幼虫&#xff0c;玉米条斑病&#xff0c;黄二化螟&#xff0c;黄二化螟幼虫7类&#xff0c;yolo标注完整&#xff0c;3900多张图像&#xff0c;全部原始数据&#xff…

青少年软件编程(图形化)等级考试试卷(三级)

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;三级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 总体情况姓名开始时间结束时间用时(分钟)得分得分率是否通过考试状态xXx2023-03-192023-03-1959.5769.50.7Y已评卷 一、单选题(共25题&#x…

数据结构之树(Topk问题, 链式二叉树)

一.topk问题 取N个数中最大(小)的前k个值,N远大于k 这道题可以用堆的方法来解决,首先取这N个数的前k个值,用它们建堆 时间复杂度O(k) 之后将剩余的N-k个数据依次与堆顶数据进行比较,如果比堆顶数据大,则将堆顶数据覆盖后向下调整 时间复杂度(N-k)*log(N) 总共的时间复杂度…

2024年独立站C端只靠SEO还有机会吗?(川圣SEO)蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; 2024年独立站C端只靠SEO还有机会吗&#xff1f;#蜘蛛池SEO 都2024年了&#xff0c;你的外贸独立站推广还需要…

Xilinx 7系列FPGA的配置流程

目录 1.4配置流程 1.4.1 设备上电 ​编辑1.4.2 清除配置寄存器 1.4.3 采样模式引脚 1.4.4 同步 ​编辑1.4.5 检测设备ID ​编辑1.4.6 加载配置数据 1.4.7 CRC校验 1.4.8 启动序列 1.4配置流程 对于所有配置模式&#xff0c;7系列的基本配置流程都是相同的&…

高速USB3.0接口控制器芯片--T630

T630芯片是方寸微电子自主研发的USB3.0超高速控制器&#xff0c;具有功能丰富、性能强劲、扩展性强等特点&#xff0c;可广泛应用于视频采集卡、视频会议摄像头、监控摄像头、数字摄录机、工业照相机、测量和测试设备、医疗成像设备、打印机、扫描仪、指纹采集终端等众多电子产…

记事小本本

记事小本本 实现效果 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

TRANSCEIVER 中的LPM和DFE模块

接收端都使用了通信中常用的LPM和DFE 本质上是高通滤波器&#xff0c;一个是单项被动&#xff0c;而常用的DFE用 了反馈。参见这篇不错的文章。 赛灵思7系列FPGA GT收发器中的RX均衡器_lpm和dfe-CSDN博客

C#,T检验(T -Test)的算法与源代码

1 T-Test 学生t检验(英语:Students t-test)是指虚无假设成立时的任一检定统计有学生t-分布的统计假说检定,属于母数统计。学生t检验常作为检验一群来自正态分配母体的独立样本之期望值的是否为某一实数,或是二群来自正态分配母体的独立样本之期望值的差是否为某一实数。举…

Android自定义view从入门到高级

简介 什么是自定义view&#xff1f;我认为只要不是编译器直接提供可以使用的view&#xff0c;都可以认为是自定义view。自定义view主要分为两大类&#xff0c;第一类自定义view可以通过系统提供的各种view组合&#xff0c;样式变化实现的view。第二类是通过继承view或者ViewGro…

​高山 MPV 四驱旗舰版:新能源时代的豪华出行新选择

随着新能源技术的不断进步和消费者对高端出行体验的追求&#xff0c;MPV&#xff08;Multi-Purpose Vehicle&#xff0c;多用途车&#xff09;市场迎来了新的发展机遇。 长城汽车旗下的魏牌&#xff0c;凭借其在新能源领域的深厚技术积累&#xff0c;推出了全新的高山MPV四驱旗…

用通俗易懂的方式讲解:大模型 Rerank 模型部署及使用技巧总结

Rerank 在 RAG&#xff08;Retrieval-Augmented Generation&#xff09;过程中扮演了一个非常重要的角色&#xff0c;普通的 RAG 可能会检索到大量的文档&#xff0c;但这些文档可能并不是所有的都跟问题相关&#xff0c;而 Rerank 可以对文档进行重新排序和筛选&#xff0c;让…

【Python 5】----Pytest接口自动化(实现基础的测试框架)

安装准备 安装好pytest的环境及allure环境 1. 安装pytest pip insatll pytest2.安装allure (需要确保安装了jdk环境&#xff09;安装allure命令行&#xff1a; 访问allure官网&#xff0c;下载allure2.13.5的安装包&#xff0c;将其bin路径 添加进环境变量path中在cmd里面…