从源码角度理解Mybatis的$和#的作用

news/2024/10/19 17:41:25/

理解 MyBatis 中 $# 的作用需要从其源码实现角度来解释。在 MyBatis 中,$ 符号和 # 符号的主要作用是在动态 SQL 中替代参数,并生成最终的 SQL 语句。下面是对它们的源码解析:

  1. $ 符号的作用:

    当 MyBatis 解析 SQL 语句时,会将 $ 符号作为字符串替换处理。具体来说,MyBatis 会在 SQL 语句中找到 $ 符号所对应的变量,并将其替换为变量的实际值,然后将最终的 SQL 语句发送到数据库执行。

    这种处理方式在源码中的体现主要是在 org.apache.ibatis.scripting.xmltags.TextSqlNode 类的 apply() 方法中,该方法会对 SQL 语句中的 ${} 占位符进行处理,并将其替换为实际的参数值。

    $ 符号的作用可以总结为直接替换参数值到 SQL 语句中,但是由于是字符串替换的方式,因此容易受到 SQL 注入攻击的影响。

  2. # 符号的作用:

    $ 符号不同,# 符号在 MyBatis 中主要用于参数占位,以防止 SQL 注入攻击。在解析 SQL 语句时,MyBatis 会将 # 符号作为参数占位符处理,并将参数值以预编译的方式传递给 JDBC 执行器。

    在源码中,# 符号的处理体现在 org.apache.ibatis.scripting.xmltags.TextSqlNode 类的 apply() 方法中,该方法会将 # 符号替换为 JDBC 预编译的占位符 ?,并将参数值传递给 JDBC 执行器。

    通过预编译的方式,# 符号能够防止 SQL 注入攻击,因为参数值不会直接拼接到 SQL 语句中,而是以参数占位符的形式传递给数据库。

总的来说,从源码角度理解 MyBatis 中 $# 的作用,可以看到它们在解析 SQL 语句时的不同处理方式。$ 符号直接替换参数值到 SQL 语句中,而 # 符号通过预编译的方式传递参数值,以防止 SQL 注入攻击。因此,在编写动态 SQL 语句时,推荐使用 # 符号来传递参数,以提高应用程序的安全性。

为什么默认使用的语句是PrepareStatementHandler:

在 MyBatis 中,默认使用 PrepareStatementHandler 的主要原因是其提供了预编译 SQL 的能力,这有助于提高 SQL 执行的性能和安全性。下面是几个原因:

  1. 性能优化: PrepareStatementHandler 可以对 SQL 语句进行预编译,生成一个 SQL 执行计划,并将参数值以参数占位符的形式传递给数据库。这样可以减少 SQL 语句的解析时间,并提高 SQL 执行的效率,特别是对于频繁执行的 SQL 查询而言,性能提升会更加显著。

  2. 安全性: 使用 PrepareStatementHandler 可以有效防止 SQL 注入攻击,因为参数值是以预编译的方式传递给数据库,而不是直接拼接到 SQL 语句中。这样可以保证参数值不会被误解释为 SQL 语句的一部分,从而避免了恶意用户利用参数值执行恶意 SQL 语句的风险。

  3. 数据库兼容性: PrepareStatementHandler 在各种数据库中都有良好的兼容性,因为大多数数据库都支持 SQL 的预编译执行方式。这样,MyBatis 可以在不同的数据库中保持一致的 SQL 执行方式,而无需针对不同的数据库做特殊处理。

  4. 可维护性: PrepareStatementHandler 提供了较高的代码可维护性,因为它可以将 SQL 语句与参数值分离开来,使得 SQL 语句的编写更加清晰简洁。此外,由于 SQL 语句是预编译的,因此可以方便地进行重用和调整,减少了代码的重复编写。


http://www.ppmy.cn/news/1401816.html

相关文章

uniApp使用XR-Frame创建3D场景(4)金属度和粗糙度

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这一篇我们讲解xr-frame中关于mesh网格材质的金属度和粗糙度的设置。 1.先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{…

Android MediaPlayer

MediaPlayer 类是媒体框架最重要的组成部分之一。此类的对象能够获取、解码以及播放音频和视频&#xff0c;而且只需极少量设置。它支持多种不同的媒体源&#xff0c;例如&#xff1a; • 本地资源 • 内部 URI&#xff0c;例如您可能从内容解析器那获取的 URI • 外部网址…

从头搭建GPT(Andrej Karpathy) 笔记

本文来自openAI联合创始人,曾担任特斯拉视觉部门总监的Andrej的视频Let’s build GPT。 文章目录 简单介绍数据处理部分什么是tokenize计算loss直觉上的self-attention矩阵乘法实现self-attention:self-attention和cross-attention有什么区别attention中为什么要做scaling继续…

Springboot之RESTful风格

目录 1、概述&#xff1a; 1.1、传统风格的API&#xff1a; 1.2、RESTful风格的API&#xff1a; 1.3、GET、POST、PUT、DELETE&#xff1a; 2、RESTful风格相关的注解&#xff1a; ①PathVariable&#xff0c;用来获取url中的数据&#xff1b; ②GetMapping&#xff0c;接…

Sentinel原理及实践

Sentinel 是什么 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 为什么使用sentinel&…

揭秘Java并发编程模式:探索生产者-消费者、读写锁等经典模式

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

react native 使用ScrollView实现下拉更新,上拉加载更多

在React Native中&#xff0c;要实现下拉更新和上拉加载更多的功能&#xff0c;你需要自定义ScrollView组件&#xff0c;监听滚动事件并根据滚动的位置来判断何时触发更新和加载更多的操作。以下是一个基本的实现思路&#xff1a; 监听滚动事件&#xff1a;使用ScrollView的on…

企微获客助手到底有哪些价值?

获客助手作为企业微信官方提供的获客工具&#xff0c;在私域布局中确实展现了其强大的引流效率和便利性。这一工具通过简化传统引流过程中的复杂步骤&#xff0c;使得企业能够更高效地吸引和转化潜在客户。此外&#xff0c;获客助手还能实现不同渠道的无缝链接&#xff0c;进一…