一文了解MyBatis

文章目录

  • MyBatis
    • 1. MyBatis的执行流程
    • 2. MyBatis是否支持延迟加载
    • 3. MyBatis延迟加载的底层原理
    • 4. MyBatis的二级缓存机制用过吗
    • 5. 谈谈MyBatis框架的优势
    • 6. 简单描述MyBatis的工作原理
    • 7. MyBatis中的sql标签
    • 8. MyBatis中的${}和#{}的区别
    • 9. MyBatis中ResulyMap的作用[重要]
    • 10. MyBatis框架如何方式SQL注入攻击
    • 11. MyBatis框架中使用的设计模式有哪些

MyBatis

1. MyBatis的执行流程

在这里插入图片描述

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

2. MyBatis是否支持延迟加载

  • 延迟加载指的是在需要用到数据时才进行加载,不需要用到数据时就不加载数据
  • MyBatis支持一对一关联对象和一对多关联集合对象的延迟加载
  • 在MyBatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnable=true|false,默认是关闭的

3. MyBatis延迟加载的底层原理

  • 使用CGLIB创建目标对象的代理对象
  • 当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,执行sql查询
  • 获取数据以后,调用set方法设置属性值,再继续查询目标方法就有值了

4. MyBatis的二级缓存机制用过吗

  • 一级缓存:基于perpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,改Session中的所有Cache就将清空,默认打开一级缓存
  • 二级缓存是基于namespace和mapper的作用域起作用的,不是依赖于SqlSession,默认也是采用PerpttualCache,HashMap存储。需要单独开启,一个是核心配置,一个是mapper映射文件

5. 谈谈MyBatis框架的优势

        MyBatis是一个优秀的持久化框架,它与传统的JDBC操作相比,具有以下几个方面的优势:

  • 简化SQL编写:MyBatis提供了强大的SQL映射功能,使用XML或注解的方式,将Java对象与SQL语句进行映射。这样可以减少大量的重复的SQL编写,提高开发效率
  • 灵活的动态SQL应用:myBatis允许开发人员通过动态SQL方式,直接在SQL语句中进行逻辑控制
  • 参数和结构映射:MyBatis支持灵活的参数和结果映射,可以直接将Java对象作为参数传递给SQL语句,也可以将SQL查询结果直接映射到Java对象
  • 缓存支持:MyBatis具有强大的缓存功能,可以对查询结果进行缓存,提高查询性能。同时,还可以手动设置缓存策略,根据时机需求进行灵活的配置
  • 易于集成:MyBatis可以与各种主流的开发框架进行无缝集成,可以通过简单的配置,将MyBatis与其他组件进行整合,提高开发效率和易用性。
  • 易于测试:MyBatis的设计使用数据库操作与Java代码解耦,可以方便进行单元测试和持续集成。可以使用Mock对象或内存数据库进行测试,提高开发质量和效率
  • 可扩展:MyBatis支持插件的扩展机制,可以自定义各种插件来扩展框架的功能。可以对查询结果进行加工处理、监控SQL执行、打印SQL日志等,满足特定的业务需求

6. 简单描述MyBatis的工作原理

        MyBatis的工作原理可以分为三步

  • 首先,MyBatis会读取xml配置文件或注解配置,初始化Configuration对象,并解析Mapper接口中的注解或xml文件。
  • 其次,MyBatis会根据Mapper接口和SQL语句生成代码对象,并调用代码对象的方法来执行SQL语句。
  • 最后,MyBatis会将查询结果映射成Java对象,并返回给调用方。

7. MyBatis中的sql标签

  • <if>:用于条件判断
  • <choose>, <when>和<otherwise>:用于实现类似于Java中的switch-case语句的逻辑
  • <trim>, <where>和<set>:用于处理SQL语句中的空格和条件片段
  • <foreach>:用于循环遍历集合

8. MyBatis中的${}和#{}的区别

        在MyBatis中,${}和#{}是占位符的两种不同形式。

  • #{}是安全的占位符,它会将传入的参数进行自动的预编译和转义,防止SQL注入攻击。#{}主要用于接收参数值,可以在SQL语句中使用。

  • 是文字替换占位符,它会将传入的参数值直接替换到 S Q L 语句中,不会进行预编和转义。 {}是文字替换占位符,它会将传入的参数值直接替换到SQL语句中,不会进行预编和转义。 是文字替换占位符,它会将传入的参数值直接替换到SQL语句中,不会进行预编和转义。{}可以用于在SQL语句中拼接表名、列名等动态的部分。

9. MyBatis中ResulyMap的作用[重要]

        在MyBatis中,ResultMap元素用于定义数据库查询结果与Java对象之间的映射关系。它可以通过配置方式实现对查询结果集的处理,将结果集中的列与Java对象的属性进行对应关系的映射。常用的ResultMap子元素包括:

  • id:用于给ResultMap元素指定一个唯一的标识符

  • result:用于配置一个属性映射关系,指定查询结果集中的一个列与Java对象的一个属性之间的对应关系。可以使用column子元素指定查询结果集中的列名,使用property子元素指定Java对象的属性名。

  • association:用于配置一个关联对象的映射关系。

  • collection:用于配置一个关联对象的集合映射关系

        MyBatis中的ResultMap元素是实现数据库查询结果与Java对象之间映射的重要配置元素。通过定义和配置ResultMap元素,可以灵活处理数据库查询结果,实现简单的列名与属性名的映射,处理复杂的类型映射,处理复杂关联查询等,提高开发效率和代码的可维护性。

10. MyBatis框架如何方式SQL注入攻击

  • 参数化查询:使用参数化查询是防止 SQL 注入攻击的最佳方法之一。在 MyBatis 中,通过在 SQL 语句中使用参数占位符(例如 #{param}),然后将参数值传递给查询方法,MyBatis 会自动处理参数的转义,从而防止 SQL 注入攻击。
  • 动态SQL:在 MyBatis 中,可以使用动态 SQL 构建复杂的 SQL 查询语句。然而,需要谨慎处理动态 SQL 中的用户输入,以避免潜在的 SQL 注入风险。MyBatis 提供了一些安全的方式来构建动态 SQL,如使用 , , , 等标签,这些标签会自动处理参数的转义。
  • 输入验证:在接收用户输入之前,进行输入验证是防止 SQL 注入攻击的关键步骤。确保只接受预期格式和类型的数据,并拒绝任何异常或不合法的输入。
  • 最小权限原则:在数据库中为应用程序设置最小权限,限制应用程序执行的操作,可以最大程度地减少潜在的安全风险。

        通过结合以上方法,并且定期审查和更新代码,可以有效地防止 MyBatis 应用程序遭受 SQL 注入攻击。

11. MyBatis框架中使用的设计模式有哪些

  1. 建造者模式:SqlSessionFactoryBuilder,此对象用于创建SqlSessionFactory对象
  2. 工厂模式:SqlSessionFactory,此对象用于创建SqlSession对象
  3. 单例模式:ErrorContext,线程内部单例,底层是现实ThreadLocal
  4. 代理模式:@Mapper注解描述的接口创建动态代理对象
  5. 策略模式:缓存淘汰策略-LRU/FIFO
  6. 装饰模式:通过CachingExecutor对一级缓存进行添加二级缓存应用
  7. 桥接模式:驱动程序,JDBC连接数据库需要通过驱动程序Driver
  8. 享元模式:连接池(driud,HiKariCP),线程池
  9. 适配器模式:日志Log,可以将logj等日志API转换成mybatis中的实现
  10. 模板方法模式:SqlSessionTemplate,此对象提供了访问数据库的一些模板方法
    适配器模式:日志Log,可以将logj等日志API转换成mybatis中的实现
  11. 模板方法模式:SqlSessionTemplate,此对象提供了访问数据库的一些模板方法
  12. 组合模式:将动态SQL中各个元素组合成一个完整的SQL语句

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

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

相关文章

UDP网络聊天室(更)

服务器端 #include <header.h> typedef struct node {char name[20];struct sockaddr_in cli_addr;struct node *next; }node,*node_p; typedef struct msg {char type;char name[20];char text[128]; }msg; node_p create_link() {node_p H(node_p)malloc(sizeof(node)…

网络业务创新驱动下的DPU P4技术,中科驭数在网络开源技术生态大会上分享最新进展

2024年5月25日&#xff0c;由中国通信学会指导&#xff0c;中国通信学会开源技术专业委员会、江苏省未来网络创新研究院主办的第四届网络开源技术生态大会在北京举办&#xff0c;中科驭数产品总监李冬以《合作如兰&#xff0c;扬扬其香 中科驭数助力P4产业发展与生态建设》为主…

Cweek2+3

C语言学习 五.操作符 5.单目操作符(2) sizeof不能用于计算动态分配的内存 在对数组使用sizeof时&#xff0c;返回的是整个数组的大小&#xff08;所有元素的总字节数&#xff09;。而对指针使用sizeof时&#xff0c;返回的是指针本身的大小&#xff08;通常是机器字长的大小…

怎么简单的把图片缩小?图片在线改大小的方法

在日常工作中经常需要在网上上传图片&#xff0c;但是一般网上不同的平台对上传的图片大小和尺寸都会有限定的要求&#xff0c;不符合要求无法正常上传使用。所以当遇到图片太大的问题时&#xff0c;该如何快速修改图片大小&#xff0c;有很多的小伙伴都很关注这个问题的解决方…

【Qt秘籍】[002]-开始你的Qt之旅-下载

一、Qt的开发工具有哪些&#xff1f; Qt的开发工具概述Qt支持多种开发工具&#xff0c;其中最常见的开发工具是 1.QtCreator 【易上手/有少量bug/适合新手】 2.VisualStudio 【功能强大/易出错/需要更多额外配置】 3.Eclipse 【清朝老兵IDE/不建议使用】 【注意&#xff1…

【第三节】类的构造和析构函数

目录 一、数据成员的初始化 二、构造函数 2.1 什么是构造函数 2.2 构造函数的注意事项 三、析构函数 四、带参数的构造函数 五、缺省构造函数 六、构造函数初始化列表 七、拷贝构造函数和调用规则 八、深拷贝和浅拷贝 九、总结 一、数据成员的初始化 定义普通变量&am…

基于BP神经网络和小波变换特征提取的烟草香型分类算法matlab仿真,分为浓香型,清香型和中间香型

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................................................... …

深入探究Java自动拆箱与装箱的实现原理

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Linux:进程控制(二.详细讲解进程程序替换)

上次讲了&#xff1a;Linux&#xff1a;进程地址空间、进程控制&#xff08;一.进程创建、进程终止、进程等待&#xff09; 文章目录 1.进程程序替换1.1概念1.2原理1.3使用一个exec 系列函数execl&#xff08;&#xff09;函数结论与细节 2.多进程时的程序替换3.其他几个exec系…

mysql连接池的实现

概要&#xff1a;本文介绍mysql连接池的实现&#xff0c;要求读者了解线程池 一、为什么需要mysql连接池&#xff1f; 资源复用 &#xff1a;不使用连接池&#xff0c;每次数据库请求都新建一条连接&#xff0c;将耗费系 统资源。 流程如下&#xff1a; 通过三次握手建立 TC…

大数据面试题 —— Hive

目录 Hive 是什么为什么要使用 HiveHive 的优缺点Hive的实现逻辑&#xff0c;为什么处理小表延迟比较高你可以说一下 HQL 转换为 MR 的任务流程吗 ***你可以说一下 hive 的元数据保存在哪里吗 ***Hive与传统数据库之间的区别Hive内部表和外部表的区别 ***hive 动态分区与静态分…

Hotcoin Research | 市场洞察:2024年5月13日-5月19日

加密货币市场表现 目前&#xff0c;加密货币总市值为1.32万亿&#xff0c;BTC占比54.41%。 本周行情呈现震荡上行的态势&#xff0c;BTC在5月15日-16日&#xff0c;有一波大的拉升&#xff0c;周末为震荡行情。BTC现价为67125美元。 上涨的主要原因&#xff1a;美国4月CPI为3…

效率工作:一键为多种资产添加统一材质(小插件)

1.需求分析&#xff1a; 当导入一批资产&#xff0c;或者有同一批结构体需要添加相同材质时&#xff0c;单独为每个模型都添加材质费时费力&#xff0c;有没有什么办法&#xff0c;能同时为多个资产添加材质。 2.操作实现 1.在网上找到了一款插件&#xff0c;经过验证&#xf…

如何将天猫内容保存为PDF格式?详细步骤与实战解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;保存天猫内容的重要性 二、环境准备与工具安装 1. 安装必要的Python包…

SpringCloud之SSO单点登录-基于Gateway和OAuth2的跨系统统一认证和鉴权详解

单点登录&#xff08;SSO&#xff09;是一种身份验证过程&#xff0c;允许用户通过一次登录访问多个系统。本文将深入解析单点登录的原理&#xff0c;并详细介绍如何在Spring Cloud环境中实现单点登录。通过具体的架构图和代码示例&#xff0c;我们将展示SSO的工作机制和优势&a…

HCIP-Datacom-ARST自选题库__BGP多选【22道题】

1.BGP认证可以防止非法路由器与BGP路由器建立邻居&#xff0c;BGP认证可以分为MD5认证和Keychain认证&#xff0c;请问以下哪些BGP报文会携带BCGP Keychain认证信息?(报头携带) open Update Notication Keepalive 2.传统的BGP-4只能管理IPv4单播路由信息&#xff0c;MP-B…

Spring-Cloud-OpenFeign源码解析-04-调用流程分析

在Spring-Cloud-OpenFeign源码解析-03-FeignClientFactoryBean分析到&#xff0c;通过Autowired或者Resource注入FeignClient实例的时候&#xff0c;实际上返回的是JDK动态代理对象&#xff0c;具体的实现逻辑在InvocationHandler的invoke方法中 回看ReflectiveFeign.newInsta…

AI大模型日报#0528:Greg专访 | 为什么OpenAI最先做出GPT-4、xAI获60亿美元融资、李飞飞经典对话Hinton

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-34B&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xff0…

YOLOv8/YOLOv7/YOLOv5+CRNN-车牌识别、车牌关键点定位、车牌检测(毕业设计)

目录 一、前言1、项目介绍2、图片测试效果展示 二、项目环境配置1、pytorch安装&#xff08;gpu版本和cpu版本的安装)2、pycocotools的安装3、其他包的安装 三、yolov8/yolov7/yolov5CRNN-中文车牌识别、车牌关键点定位、车牌检测算法1、yolov8算法介绍2、CRNN算法介绍3、算法流…

【加密与解密(第四版)】第十三章笔记

第十三章 HOOK技术 13.1 Hook概述 IAT HOOK&#xff08;改地址&#xff09; BOOL IAT_InstallHook(){BOOL bResult FALSE ;HMODULE hCurExe GetModuleHandle(NULL);PULONG_PTR pt ;ULONG_PTR OrginalAddr;bResult InstallModuleIATHook(hCurExe,"user32.dll",&qu…