news 2026/8/22 12:36:06

4.1-CRUD+动态SQL【复用】+防注入:参数解析与引用机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
4.1-CRUD+动态SQL【复用】+防注入:参数解析与引用机制

处理数据访问参数的基础知识点,直接关系到 SQL 执行的安全性和规范性

一、#{}预编译参数绑定(推荐使用)

#{}是 MyBatis 参数引用的核心方式,其底层实现和核心特性是该知识点的重点:

  1. 底层实现

    MyBatis 在解析#{}时,会将其转换为 JDBC 中的PreparedStatement(预编译语句对象)的占位符?,后续参数值会通过setXxx()方法(如setInt()setString())传入占位符,而不是直接嵌入 SQL 语句

  2. 三大核心特性(推荐使用的原因)

    • 防 SQL 注入(核心优势):由于参数值是作为独立数据传入预编译语句,而非 SQL 语句的组成部分,即使参数中包含恶意 SQL 片段(如' or 1=1 --),也会被当作普通字符串处理,无法执行恶意逻辑,有效保障数据库安全
    • 自动类型转换:MyBatis 会自动匹配 Java 方法参数类型与数据库表字段类型,完成数据类型的转换(如 Java 的Integer转换为数据库的INTString转换为VARCHAR),无需开发者手动处理类型兼容问题
    • 兼容性强:支持各种复杂参数类型(基本数据类型、实体类、Map、注解指定参数名等),适配绝大多数业务场景

二、${}字符串直接拼接(慎用)

这是与#{}对应的参数引用方式,也是该知识点的重要补充,需明确其特性和适用场景:

  1. 底层实现

    MyBatis 解析${}时,会直接将传入的参数值进行字符串拼接,嵌入到 SQL 语句的对应位置,底层对应 JDBC 的Statement(普通语句对象),无预编译处理

  2. 核心特性(局限性为主)

    • 无防 SQL 注入能力(核心风险):参数值直接拼接进 SQL,若参数包含恶意 SQL 片段,会被直接执行,存在严重的数据库安全隐患
    • 无自动类型转换:仅做纯字符串拼接,需要开发者手动保证参数类型与数据库字段类型兼容,否则会抛出 SQL 执行异常
    • 支持动态占位(唯一优势):可以动态指定 SQL 中的表名、列名、排序字段、查询条件关键字(如ASC/DESC)等,这些场景#{}无法满足(因为预编译占位符?不能替代表名、列名等 SQL 关键字)
  3. 适用场景(仅限特殊需求)

    仅用于无需考虑注入风险(如参数由系统内部生成,非用户输入)的动态 SQL 场景,示例:

<!-- 动态指定排序字段和排序方式,只能使用${} --> <select id="getUserList" resultType="com.example.entity.User"> SELECT * FROM user ORDER BY ${sortColumn} ${sortType} </select>

三、核心价值与注意事项

  1. 核心价值

    • 掌握该机制能保证 SQL 执行的安全性,避免核心的 SQL 注入漏洞
    • 合理选择#{}${},既能满足常规业务需求,又能适配特殊动态 SQL 场景,提升开发的规范性和灵活性
  2. 必备注意事项

    • 开发中优先使用#{},这是 MyBatis 的推荐最佳实践,最大限度保障系统安全
    • 使用${}时必须做严格的参数校验和过滤,禁止直接使用用户输入的参数作为${}的取值,避免注入风险

总结

  1. 核心知识点:MyBatis 参数解析与引用机制(#{}预编译绑定 vs${}字符串拼接)
  2. 重点:#{}的防注入、自动类型转换特性,以及${}的适用场景和风险
  3. 开发原则:优先用#{},慎用${}并做好参数校验
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 12:34:43

PromptHero:AI提示词宝库,解锁创意无限可能

1. PromptHero&#xff1a;你的AI创意加速器&#xff0c;到底有多神&#xff1f; 如果你玩过AI绘画&#xff0c;或者尝试过用ChatGPT写点东西&#xff0c;那你肯定有过这样的经历&#xff1a;脑子里有个绝妙的画面&#xff0c;但写出来的提示词&#xff08;Prompt&#xff09;生…

作者头像 李华
网站建设 2026/8/22 12:35:24

XPINN实战:如何用Python实现高维偏微分方程的高效求解(附代码)

XPINN实战&#xff1a;用Python攻克高维偏微分方程的工程化方案 在科学计算和工程仿真领域&#xff0c;高维偏微分方程的求解一直是个令人头疼的难题。传统的数值方法&#xff0c;比如有限元或有限差分&#xff0c;一旦维度升高&#xff0c;计算量就会呈指数级爆炸&#xff0c;…

作者头像 李华
网站建设 2026/7/14 16:39:13

MQ-9可燃气体传感器在TI TMS320F28P550开发板上的ADC与GPIO驱动移植实战

MQ-9可燃气体传感器在TI TMS320F28P550开发板上的ADC与GPIO驱动移植实战 最近在做一个环境监测的小项目&#xff0c;需要检测一氧化碳和可燃气体&#xff0c;用到了MQ-9传感器。很多刚开始接触TI C2000系列DSP&#xff08;比如TMS320F28P550&#xff09;的朋友&#xff0c;可能…

作者头像 李华
网站建设 2026/7/14 16:39:11

软件测试新姿势:我是如何用AI工具发现3个隐藏登录漏洞的

软件测试新姿势&#xff1a;我是如何用AI工具发现3个隐藏登录漏洞的 上周&#xff0c;团队内部做了一次安全复盘&#xff0c;一个刚上线两周的会员系统被外部白帽子提交了一个中危漏洞&#xff0c;问题出在登录环节的短信验证码逻辑上。这事儿让我有点坐不住&#xff0c;因为这…

作者头像 李华
网站建设 2026/7/14 16:39:13

3.11情况

一.C竞赛&#xff1a;1.2021最大公约数&#xff08;采用辗转相除法&#xff09;int gcd(int a, int b, int c) {return gcd(gcd(a, b), c); }求三个的最大公约数返回最小公倍数&#xff1a;int lcm(int a,int b){return a/gcd(a,b)*b;}#include<iostream> using namespa…

作者头像 李华
网站建设 2026/7/14 16:39:25

Gemma大模型(2B/7B)高效微调实战:从LoRA到QLoRA技术解析

1. 为什么你需要了解Gemma和高效微调&#xff1f; 如果你对AI大模型感兴趣&#xff0c;但又觉得动辄几百上千亿参数的模型离自己太远&#xff0c;觉得训练和微调都是大公司的专属游戏&#xff0c;那今天这篇文章就是为你准备的。我花了很长时间折腾各种大模型&#xff0c;从早期…

作者头像 李华