mybatis 中#和$4}的区别是什么?

{}通过预编译防止SQL注入并提升性能,${}则直接字符串替换易引发安全风险;前者用于参数值,后者仅用于表名列名等需动态拼接的场景且必须严格校验。

mybatis 中#和$4}的区别是什么?

MyBatis里,#{}${} 的核心区别在于它们处理参数的方式:#{} 会将参数视为一个值,通过预编译(PreparedStatement)的方式安全地进行参数替换,有效防止SQL注入;而 ${} 则是直接的字符串替换,它会将传入的内容原样拼接到SQL语句中,虽然在某些特定场景下有用,但极易引发SQL注入风险。

解决方案

当你使用 #{} 语法时,MyBatis 会在底层为你的SQL语句生成一个 PreparedStatement 对象。想象一下,数据库接收到的查询语句中,参数的位置都是用问号 ? 占位的。比如,你写 SELECT * FROM users WHERE id = #{userId},MyBatis 会把它翻译成类似 SELECT * FROM users WHERE id = ?,然后把 userId 的值作为参数绑定到这个问号上。这种方式的好处是显而易见的:数据库在执行之前就已经确定了SQL语句的结构,它只关心 ? 后面跟着的是什么值,而不会把这个值当作SQL命令的一部分来解析。这就从根本上杜绝了恶意的SQL代码片段被注入执行的可能性。而且,数据库通常会对预编译的SQL语句进行优化,缓存执行计划,这对性能也是有益的。

${} 就完全是另一回事了。它就像一个简单的文本替换工具。你写 SELECT * FROM ${tableName} WHERE id = #{userId},如果 tableName 的值是 users,那最终执行的SQL就是 SELECT * FROM users WHERE id = ?。看起来好像没什么问题?但如果 tableName 的值是 users; DROP TABLE orders; 呢?那最终的SQL就会变成 SELECT * FROM users; DROP TABLE orders; WHERE id = ?。这下麻烦就大了,数据库可能会先执行 SELECT,然后紧接着就把你的 orders 表给删了。这就是典型的SQL注入。所以,除非你对传入的字符串有绝对的控制和严格的校验,否则使用 ${} 是非常危险的。它主要用于那些不能被参数化的SQL元素,比如表名、列名、排序字段(ORDER BY 后面的字段)等等。

什么时候应该使用 #{}?

绝大多数情况下,只要你传递的是一个数据值,一个需要被查询、插入、更新或删除的具体内容,你就应该无脑选择 #{}。这不仅仅是出于安全的考虑,更是MyBatis设计哲学的一部分。它帮你处理了数据类型转换、特殊字符转义等一系列繁琐的事情,让你能专注于业务逻辑本身。

举个例子,无论是用户的ID、姓名、年龄,还是商品的库存、价格,订单的状态,这些都是数据。当你需要根据这些数据进行筛选、更新或者插入时,#{} 就是你的不二之选。比如:

  SELECT * FROM user WHERE id = #{id}  INSERT INTO user (name, age) VALUES (#{name}, #{age})  UPDATE user SET age = #{age} WHERE id = #{id}

你看,这里的 idnameage 都是具体的值。使用 #{},MyBatis 会自动帮你处理好它们的数据类型,比如 id 是整数,name 是字符串,它会以最安全的方式把它们传递给数据库。你几乎不需要担心什么,只管把参数传进去就行。这是一种规范,也是一种最佳实践,能让你的代码更健壮、更易于维护。

什么时候必须使用 ${}?它的潜在风险是什么?

既然 #{} 这么好,那为什么还需要 ${} 呢?这就是一个“不得不为之”的选择。有些SQL语句的组成部分,它本身就不是一个“值”,而是一个SQL关键字或者一个数据库对象的名字。比如,你想动态地指定查询的列名,或者动态地指定排序的字段和顺序。

考虑一个场景,你有一个通用的查询接口,用户可以指定按哪个字段排序,是升序还是降序。这时候,ORDER BY 后面的列名和 ASC/DESC 就不能用 #{} 了,因为它们不是数据,而是SQL语句的结构。

<!--   SELECT * FROM user ORDER BY #{columnName} #{sortOrder} -->  SELECT * FROM user ORDER BY ${columnName} ${sortOrder}

在这种情况下,columnNamesortOrder 必须用 ${} 来替换。因为数据库需要直接看到 ORDER BY name ASC 这样的完整字符串,而不是 ORDER BY ? ?

汉仪书宋一字体 汉仪书宋一字体

汉仪书宋一简是汉仪字库里面宋体的一种,与宋体字没什么区别,通常用于特殊提醒如批注中。

汉仪书宋一字体 37 查看详情 汉仪书宋一字体

但是,这里面的风险是巨大的,我前面也提到了。如果 columnName 传入的是 name; DROP TABLE user; 这样的恶意字符串,那么你的用户表可能就没了。

要规避这种风险,通常的做法是:

白名单校验: 在Java代码层面,严格校验传入的 ${} 参数。比如,如果 columnName 只能是 id, name, age 这三个之一,你就写个 if/else 或者 switch 来判断,只允许这些合法值通过。避免用户直接输入: 尽量不要让用户直接输入这些会用 ${} 替换的参数,而是提供下拉框、单选按钮等方式,让他们选择预设好的合法值。

说实话,每次用到 ${} 我都会心里咯噔一下,然后立刻去检查有没有做严格的输入校验。这就像在代码里埋了个小地雷,虽然你知道它在哪儿,但总得小心翼翼地绕过去。

除了安全性,#{} 和 ${} 在性能上有什么差异吗?

除了安全性这个最核心的区别,#{}${} 在性能上确实也存在差异,这主要与数据库如何处理SQL语句有关。

当数据库收到一个SQL查询时,它通常会经历几个阶段:解析(parsing)、优化(optimization)、执行(execution)。

使用 #{} 时,MyBatis 会生成 PreparedStatement。这意味着SQL语句的结构是固定的,参数是独立的。数据库第一次收到这样的语句时,会对其进行解析和优化,生成一个执行计划(execution plan),然后将这个计划缓存起来。后续再执行相同的SQL语句(只是参数不同),数据库可以直接复用之前缓存的执行计划,省去了重复解析和优化的开销。这对于高并发、频繁执行的查询来说,能显著提升性能。数据库只需要把新的参数绑定到已经准备好的执行计划上就行了,效率自然更高。

${} 则不同。每次使用 ${} 拼接的SQL语句,对于数据库来说,都是一条全新的、从未见过的SQL语句。即使只有一小部分内容不同,数据库也认为这是一条全新的查询。因此,每次执行这样的SQL语句,数据库都需要重新进行解析、优化,并生成新的执行计划。这个过程虽然在单次查询中开销可能不明显,但在高并发或大量重复查询的场景下,这些额外的解析和优化开销就会累积起来,对数据库的CPU和内存造成不必要的负担,从而影响整体性能。

所以,从性能角度看,#{} 的预编译和参数绑定机制,使得数据库能够更高效地处理重复查询,减少了不必要的解析和优化开销,在多数情况下都优于 ${}${} 带来的性能损耗,虽然可能不如SQL注入的风险那么立竿见影,但长期来看,对系统稳定性和扩展性也是一个潜在的隐患。

以上就是mybatis 中#和$4}的区别是什么?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1020384.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 01:16:05
下一篇 2025年12月2日 01:17:09

相关推荐

  • php攻击有哪些

    针对 PHP 应用程序的攻击类型及其防护措施:SQL 注入: 使用参数化查询防止恶意数据修改数据库。跨站脚本(XSS): 输出转义用户输入,防止恶意脚本执行。远程代码执行(RCE): 使用安全框架和定期更新软件,修复漏洞。文件包含: 限制外部文件包含,防止恶意代码执行。信息泄露: 加密敏感信息,防止…

    2025年12月9日
    000
  • PHP框架社区的活跃程度对比

    在 php 框架中,社区活跃程度的衡量指标包括贡献者数量、问题的响应时间和支持的文档。laravel 拥有最活跃的社区,其丰富的贡献者、快速的响应时间和全面的文档使其成为初学者和经验丰富的开发人员的理想选择。symfony 提供稳定性,而 codeigniter 以易用的文档吸引初学者。 PHP 框…

    2025年12月9日
    000
  • 币安交易所(binance)新手如何进行合约交易操作及防爆仓指南

    币安合约交易需先熟悉界面,包括交易对、K线图、委托区和仓位信息,重点关注强平价格;执行交易时选择交易对、设置杠杆(新手建议低倍)、下单类型及数量,确认后提交;开仓后应设置止盈止损以控制风险;逐仓模式下可追加保证金降低强平风险;根据风险偏好在全仓与逐仓间切换保证金模式,全仓风险更高但资金利用率高。 币…

    2025年12月9日
    000
  • 币安binance交易所官网直链 Binance网页版安全登录链接

    币安binance 是当前全球交易量领先的数字资产交易平台之一,提供现货、合约、理财等多类型服务。本文将围绕 币安官网直链 与 网页版安全登录流程 展开,帮助你快速、安全进入 binance 官方页面完成账户操作。 币安Binance官网访问入口 要登录币安网页版,可通过浏览器输入官方域名进入官网首…

    2025年12月9日
    000
  • 以太坊是公链吗还是私链?大白话讲解

    很多刚接触区块链的朋友都会好奇,以太坊到底是公有的还是私有的?这篇文章将用最简单直白的方式,帮您彻底搞懂公链和私链的区别,并明确以太坊的真正属性。 一、什么是公链? 1、公链,全称公共区块链,顾名思义,它是一个对全世界开放的网络。 2、任何人都可以自由地加入这个网络,读取数据、发送交易,并参与到交易…

    2025年12月9日
    000
  • 一文了解币圈:以太坊在哪里诞生?怎么购买?有什么作用?

    以太坊(ethereum)作为区块链技术的重要里程碑,不仅是一种数字资产,更是一个支持去中心化应用的全球性开源平台。本文旨在为初学者快速梳理以太坊的起源、获取方式及其核心应用场景,帮助您构建一个清晰的认知框架。 一、以太坊的诞生 1、以太坊最初由程序员 Vitalik Buterin 在2013年提…

    2025年12月9日
    000
  • 狗狗币是什么类型的币 一文了解狗狗币

    狗狗币(Dogecoin),常被昵称为“狗狗币”,最初作为一个网络玩笑诞生,但现已发展成为全球知名的数字资产之一。本文将为您详细解析狗狗币的起源、技术特点及其独特的社区文化,帮助您全面了解这个从互联网迷因(Meme)中走出的特殊加密货币。 一、源于玩笑的诞生 1、狗狗币于2013年由软件工程师比利·…

    2025年12月9日
    000
  • 比特币基础知识普及_小白也能看懂的数字货币

    比特币是一种去中心化的数字货币,基于区块链技术运行,总量恒定2100万枚,通过挖k产生,具有稀缺性、安全性和全球共识价值,需用账户存储并注意私钥安全与价格波动风险。 比特币基础知识普及_小白也能看懂的数字货币 你是否经常听到比特币、区块链这些词汇,感觉它们听起来既神秘又高大上,仿佛是另一个世界的东西…

    2025年12月9日
    000
  • 币安为什么会是全球交易量最大的加密货币交易所?优势详解

    币安凭借高流动性、丰富产品、安全技术及全球化生态领先行业:其庞大用户基础和高效撮合系统保障交易深度与低滑点,多元币种与衍生品满足各类投资需求,高性能引擎与多重安全机制确保稳定与资产安全,全球布局与自建公链生态增强用户粘性,形成可持续发展的行业龙头优势。 币安Binance 币安Binance官网入口…

    2025年12月9日
    000
  • 一文读懂:狗狗币和小狗币的区别

    狗狗币(dogecoin)与小狗币(shiba inu)虽然都源于同一个网络迷因,并常被相提并论,但它们在技术基础、市场定位和发展目标上存在显著差异。本文将从多个维度深入解析,帮助您清晰地分辨这两种备受关注的数字资产。 一、出身与起源 1、狗狗币 (DOGE):诞生于2013年,由两位软件工程师作为…

    2025年12月9日
    000
  • 怎么几千块进场币圈快速翻百倍?

    1、%ignore_a_1%Binance 币安Binance官网入口: 币安BinanceAPP下载链接: 2、欧易okx 欧易okx官网入口: 欧易okxAPP下载链接: 3、火币HTX 官网入口: APP下载链接: 在数字资本资产市场中,利用有限的寻求高倍数增长是部分参与者的目标。这通常涉及高…

    2025年12月9日
    000
  • 新手小白怎么买比特币?怎么选交易平台?

    比特币作为一种创新的数字资产,近年来引起了全球范围内的广泛关注。对于许多刚接触数字货币领域的新手来说,如何安全、便捷地获取比特币,并选择一个可靠的交易平台,是他们迈入这个世界的第一步。 比特币的购买过程并非遥不可及,但却需要一定的知识储备和细致的考量。从理解数字资产的基本概念,到掌握交易平台的选择标…

    2025年12月9日
    000
  • 什么是无常损失(Impermanent Loss)?它为什么是流动性提供者面临的主要风险?

    无常损失是因市场价格波动导致流动性提供者资产价值偏离的账面亏损。在AMM模型中,当ETH/USDT池中ETH价格从1000涨至1500 USDT时,套利使池内比例调整,导致LP持有资产变为少于1 ETH和多于1000 USDT,提取时总价值低于直接持有原始资产。该损失由价格波动幅度决定,与方向无关:…

    2025年12月9日
    000
  • 全球主流加密交易所盘点_2025年合规平台前十名推荐

    币安、OKX、火币、Coinbase、Kraken、Bybit、KuCoin、Bitstamp、Gemini和Bitfinex是全球主流加密交易平台。币安以高交易量和全球合规布局著称;OKX在衍生品领域突出并获迪拜与巴哈马监管批准;火币覆盖多国合规许可并推出数字资产消费卡。 选择一个具备合规资质且信…

    2025年12月9日
    000
  • 发明狗狗币的人有哪些?狗狗币详细介绍解析

    狗狗币(Dogecoin)作为加密货币领域的“幽默大师”,凭借其独特的社区文化和名人效应,早已从最初的玩笑演变成了市值巨大的主流资产。本文将深入揭秘其背后的创始团队,并全方位解析其技术特点与市场价值。 一、狗狗币的两位核心发明人 1、杰克逊·帕尔默 (Jackson Palmer):当时是Adobe…

    2025年12月9日
    000
  • 一文读懂:莱特和狗狗币哪个值钱?在哪里能买到?

    莱特币(ltc)和狗狗币(doge)都是加密世界里的知名角色,但它们的价值逻辑和市场定位截然不同。本文将从价值、技术和社区文化等角度对比两者,并介绍获取它们的主流渠道。 一、价值对比:不能只看单价 1、从单个币的价格来看,莱特币(LTC)通常远高于狗狗币(DOGE)。但这并不能完全代表“谁更值钱”。…

    2025年12月9日
    000
  • Cardano怎么进行ADA跨平台交易?在不同平台间交易Cardano的技巧

    选择支持ADA的主流平台如币安或Coinbase进行交易,确保流动性与合规性;通过去中心化交易所如SUNSwap连接Yoroi等账户实现跨链兑换,注意核对合约地址;利用经审计的跨链桥如Milkomeda或Wormhole将ADA转移至以太坊等目标链,完成网络间资产映射。 一、选择支持ADA的主流交易…

    2025年12月9日
    000
  • 什么是“加密货币的季节性”?理解不同板块间的资金轮动

    比特币主导期资金流入体现避险需求,以太坊崛起标志信心恢复,山寨币轮动反映市场扩散,Meme币爆发预示情绪高潮,形成完整加密货币季节性轮动链条。 “加密货币的季节性”指市场在特定时间段内反复出现的资金流动与板块表现规律,核心在于识别不同资产类别间的轮动顺序。 为了方便新手快速上手币圈交易并实时查看市场…

    2025年12月9日
    000
  • 币安交易所APP官网入口_一站式搞定币安安装、注册与交易入门

    想要进入加密货币的世界,选择一个安全可靠的交易平台是第一步。币安(binance)作为全球顶级的数字资产交易所,凭借其强大的功能、丰富的币种和卓越的安全性,成为了无数用户的首选。本篇指南将带你从零开始,一站式完成币安app的下载、安装、注册及基础交易。 币安官方入口(最新APP下载) 为了保障您的账…

    2025年12月9日 好文分享
    000
  • 什么是DAO的财库管理?为什么说它是决定一个DAO能否长期发展的关键?

    DAO财库管理通过去中心化方式保障资产安全与高效配置,核心职能包括资金存储、社区共识驱动的分配及透明决策。为控制风险,需设立支出上限、多签钱苞机制和链上异常监控。收益优化策略涵盖将闲置资产投入经审计的DeFi协议,如稳定币借贷、主流DEX流动性挖 矿及低风险结构化产品。所有资金使用须经完整治理流程:…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信