一文了解MyBatis

news2024/10/6 10:29:30

文章目录

  • 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.coloradmin.cn/o/1711179.html

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

相关文章

在Python中实现限定抽奖次数的机制

目录 一、引言 二、需求分析 三、设计思路 四、代码实现 4.1 使用字典存储用户抽奖次数 4.2 使用数据库存储用户抽奖次数 五、扩展与优化 六、总结 一、引言 在当今互联网应用中&#xff0c;抽奖系统作为吸引用户、提高用户参与度和活跃度的重要手段&#xff0c;已经被…

展望跨境智慧银行在全球化金融服务中的发展趋势和机遇

一、引言 随着全球经济的不断融合和金融科技的迅猛发展,跨境智慧银行作为连接不同国家和地区金融市场的桥梁,正逐渐展现出其独特的魅力和潜力。跨境支付与结算作为跨境智慧银行的核心业务之一,随着全球化的深入发展和国际贸易的日益频繁,其业务场景也愈发丰富和复杂。本文…

【智能算法应用】灰狼算法GWO求解三维路径规划问题

目录 1.算法原理2.三维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.三维路径规划数学模型 三维地形可以等效处理成山峰地形&#xff0c;数学模型为: z ( x , y ) h 0 ∑ j 1 N h j max ⁡…

Vitis HLS 学习笔记--块级控制协议-ap_ctrl_chain/ap_ctrl_hs/ap_ctrl_none

目录 1. 简介 2. 详细分析 2.1 使用场景区别 2.2 ap_continue 行为详解 2.3 ap_ctrl_chain 行为详解 3. 总结 1. 简介 块级控制协议允许硬件模块表明&#xff1a; 何时可以开始处理数据。何时完成了数据处理。以及何时处于空闲状态&#xff0c;准备接受新的数据输入。 …

【放球问题】920. 播放列表的数量

本文涉及知识点 【组合数学 隔板法 容斥原理】放球问题 本题同解 【动态规划】【组合数学】【C算法】920播放列表的数量 LeetCode 920. 播放列表的数量 你的音乐播放器里有 n 首不同的歌&#xff0c;在旅途中&#xff0c;你计划听 goal 首歌&#xff08;不一定不同&#x…

冯喜运:5.29市场避险情绪升温,黄金原油小幅收涨

【黄金消息面分析】&#xff1a;周二&#xff08;5月28日&#xff09;美盘时段&#xff0c;由于美元走弱且市场情绪出现负面变化&#xff0c;黄金收复早前跌幅&#xff0c;站上2350美元关口。金价早盘一度走弱&#xff0c;源于美联储降息可能性降低带来压力&#xff0c;投资者在…

工作软件新宠儿

想要让你的工作效率飞起来吗&#xff1f;&#x1f440; 是时候告别那些大众化的工作软件啦&#xff01;今天&#xff0c;我要给大家种草几款不常见的但超级实用的工作软件&#x1f331;&#xff0c;保证让你事半功倍哦&#xff01;&#x1f31f; 1️⃣ 亿可达 它是一款自动化…

基于ssm的微信小程序的居民健康监测系统

采用技术 基于ssm的微信小程序的居民健康监测系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 后端页面 用户信息管理 健康科普管理 公告管理 论坛…

读人工智能时代与人类未来笔记17_人类未来

1. 人类未来 1.1. 在印刷读物出现之前&#xff0c;中世纪的欧洲人主要通过社区传统获取知识 1.1.1. 通过参与收割和季节轮作积累民间智慧 1.1.2. 在礼拜场所践行信仰并遵守圣礼 1.1.3. 加入行业公会&#xff0c;学习技术&…

颈源性头痛症状及表

颈源性头痛一般表现为&#xff0c;就是说从枕后一直颞侧&#xff0c;到太阳穴附近&#xff0c;这个是枕小的一个疼痛&#xff0c;还有一部分人从枕后&#xff0c;沿着一个弧线&#xff08;如下图&#xff09;的轨迹到了前额&#xff0c;到我们前额&#xff0c;这样一个疼痛&…

详解makefile中的$(wildcard pattern)

在 Makefile 中&#xff0c;$(wildcard pattern) 是一个函数&#xff0c;用于匹配指定模式的文件&#xff0c;并返回符合条件的文件列表。这个函数通常用于获取符合特定模式的文件名&#xff0c;在编写 Makefile 时非常有用。 语法&#xff1a; makefile $(wildcard pattern)…

Vue 菜单组件开发教程

在 Vue 项目中&#xff0c;我们常常需要构建各种菜单结构。下面就来详细介绍如何基于给定的代码来开发一个菜单组件。 组件部分 一、模板部分 <template> <template v-for"item in menuTree" :key"item._id"> <el-sub-menu v-if"i…

LeetCode---栈与队列

232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int pee…

如何成为一名合格的JAVA程序员?

如何成为一名称职的Java编程人员&#xff1f;你一定不能错过的两本书。 第一本《Java核心技术速学版&#xff08;第3版&#xff09;》&#xff01; 1.经典Java作品《Java核心技术》的速学版本&#xff0c;降低学习门槛&#xff0c;帮助读者更容易学习Java&#xff0c;更快地把…

Neural Filters:照片恢复

Ps菜单&#xff1a;滤镜/Neural Filters/恢复/照片恢复 Neural Filters/RESTORATION/Photo Restoration 照片恢复 Photo Restoration借助 AI 强大功能快速恢复旧照片&#xff0c;提高对比度、增强细节、消除划痕。将此滤镜与着色相结合以进一步增强效果。 “照片恢复”滤镜利用…

阿里开源React应用动效解决方案:ant-motion

ant-motion&#xff1a;简化动效开发&#xff0c;提升用户体验 - 精选真开源&#xff0c;释放新价值。 概览 Ant Motion是由Ant Design团队精心打造&#xff0c;专为React应用设计的动画规范和组件库。它不仅仅是一套动画规范&#xff0c;更是一个完整的解决方案&#xff0c;旨…

晓语台:基于大语言模型和深度学习技术的智能创作平台,高效、个性化地创作高质量内容。

晓语台 AI&#xff1a; 晓语台是由北京字里心间科技有限公司推出的一款智能AI写作工具。它基于百度的大语言模型和混合大模型以及AIGC技术研发而成&#xff0c;内置了多种风格和主题的AI创作模板&#xff0c;覆盖了20余类行业与职业&#xff0c;近30个海内外社交平台&#xff…

150.二叉树:二叉树的后序遍历(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr, right(nullptr) {}* Tree…

2024年JAVA、C++、Pyhton学哪种语言更容易进国央企?

对于不同编程语言在进入国有企业的观点大体是正确的&#xff0c;不过在实际选择时还需考虑一些因素。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信…

YiShaAdmin:一款基于.NET Core Web + Bootstrap的企业级快速开发框架

前言 今天大姚给大家分享一款基于.NET Core Web Bootstrap的企业级快速后台开发框架、权限管理系统&#xff0c;代码简单易懂、界面简洁美观&#xff08;基于MIT License开源&#xff0c;免费可商用&#xff09;&#xff1a;YiShaAdmin。 项目官方介绍 YiShaAdmin 基于.NET…