一文了解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语句

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue进阶之Vue项目实战(四)

Vue项目实战 出码功能知识介绍渲染器性能调优使用 vue devtools 进行分析使用“渲染”进行分析判断打包构建的产物是否符合预期安装插件使用位置使用过程使用lighthouse分析页面加载情况使用performance分析页面加载情况应用自动化部署与发布CI/CD常见的CI/CD服务出码功能 出码…

【PHP小课堂】PHP中的网络组件相关函数

PHP中的网络组件相关函数 作为一门以 WEB 开发为主战场的编程语言来说&#xff0c;PHP 即使是在目前这个大环境下&#xff0c;依然也是 WEB 领域的头号玩家。我们在网络相关的功能中也提供了许多方便好用的函数组件&#xff0c;而且它们都是不需要安装扩展就能够使用的。今天&a…

vue3学习(二)

前言 上一篇分享了vue的基础指令&#xff0c;这篇记录下vue3的核心内容&#xff0c;也是自己的学习笔记&#xff0c;可能有些核心还不全&#xff0c;大佬请略过。 一、核心内容 分享这个之前&#xff0c;先声明下&#xff0c;我这里是用的脚手架的写法&#xff0c;分享的讲解截…

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

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

[ C++ ] 类和对象( 下 )

初始化列表 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟 一个放在括号中的初始值或表达式。 class Date { public: Date(int year, int month, int day): _year(year), _month(month), _d…

Next-Admin,一款基于Nextjs开发的开箱即用的中后台管理系统(全剧终)

hello&#xff0c;大家好&#xff0c;我是徐小夕。之前和大家分享了很多可视化&#xff0c;零代码和前端工程化的最佳实践&#xff0c;今天继续分享一下最近开源的 Next-Admin 项目的最新更新。 这次更新是1.0版本最后一次更新&#xff0c;也根据用户反馈的问题做了一些优化&am…

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

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

从了解到掌握 Spark 计算框架(一)Spark 简介与基础概念

文章目录 什么是 Spark&#xff1f;核心特点 Spark 对比 MapReduceSpark 编程模型RDDDataFrameDataset Spark 运行模式Spark 生态 什么是 Spark&#xff1f; Spark 是一个基于内存的分布式计算框架&#xff0c;最初由加州大学伯克利分校的 AMPLab 开发&#xff0c;后来捐赠给了…

【代码随想录】【算法训练营】【第21天】 [530]二叉搜索树的最小绝对差 [501]二叉搜索树的众数 [236]二叉树的最近公共祖先

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 21&#xff0c;天气不错的周二~ 题目详情 [530] 二叉搜索树的最小绝对差 题目描述 530 二叉搜索树的最小绝对差 解题思路 前提&#xff1a;二叉搜索树 思路&#xff1a;根据二叉搜索树的中…

李廉洋:5.29黄金早盘2365-2345区间,今日行情走势分析及策略。

黄金消息面分析&#xff1a;当前美国存在一个令人担忧且未被充分关注的问题&#xff1a;房地产行业低迷、高利率和抵押贷款利率、租金高涨以及美联储的紧缩政策构成了一个恶性循环。由于高房价和高抵押贷款利率&#xff0c;美国住房经济活动远低于两年前的水平。为了让该行业好…

Post Microsoft Build and AI Day 上海开发者日

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 这个六一怎么过&#xff1f;来微软 Reactor&#xff0c;一起过儿童节吧&#xff01; 6月1日&#xff0c;Microsoft Azure & Microsoft Reactor 面向大小朋友特别推出六一特辑&#xff0c;「Post Mic…

【原创】java+springboot+mysql日程管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Mac | Mac 移动硬盘无法分区问题

现象问题 电脑配置&#xff1a;MacBook Pro M1&#xff0c;系统 Sonoma Mac 系统新升级了 Sonoma&#xff0c;结果出现各种问题。外接屏幕居然不能旋转 90 &#xff0c;查了一下是Sonoma系统导致的&#xff0c;以及莫名发热的问题。想着要么回退一下系统算了&#xff0c;于是网…

基于tensorflow的咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、前期工作 1. 设置GPU import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:tf.config.experimental.set_memory_gr…

Redhat9 LAMP安全配置方案及测试

目录 数据库主机 安装Mariadb数据库服务 设置mariadb开机自动启动 Php主机 部署Apache服务器 设置apache服务开机自启 安装php 安装 phpMyAdmin 打开测试机 更新软件包列表&#xff1a; 首先&#xff0c;确保你的软件包列表是最新的。打开终端并输入以下命令&#xf…

电脑如何远程访问?

【天联】的使用场景 电脑远程访问在现代科技的发展中扮演了重要的角色。对于企业和个人用户来说&#xff0c;远程访问的便利性提供了许多机会和可能性。作为一种高效的工具&#xff0c;【天联】具有广泛的应用场景&#xff0c;可以实现异地统一管理、协同办公以及远程数据采集…

咖啡看书休闲时光404错误页面源码

源码介绍 咖啡看书休闲时光404错误页面源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 源码效果 源码下载 咖啡看书…

WEB安全:Content Security Policy (CSP) 详解

Content Security Policy (CSP) 是一种强大的网页安全机制,用于防止跨站脚本 (XSS) 和其他注入攻击。通过设置一系列的内容安全策略,CSP 可以限制网页可以加载的资源,从而保护用户数据和网站的安全性。 什么是 XSS 攻击? 跨站脚本攻击 (XSS) 是一种常见的安全漏洞,攻击者…

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

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

“2024南京智博会”共同探索智能科技产业创新发展新路径

随着全球数字化浪潮的深入推进&#xff0c;智慧城市、物联网与大数据等领域的发展成为推动经济社会发展的重要力量。在这样的背景下&#xff0c;2024南京国际智慧城市、物联网、大数据博览会&#xff08;南京智博会&#xff09;的举办&#xff0c;无疑为国内外企业提供了一个绝…