MyBatis-- 浅谈SQL中 #、$参数的动态解析过程

本文详细探讨了MyBatis中#{}和${}在SQL动态解析过程中的差异,解释了它们在预编译、参数处理和防止SQL注入等方面的作用。建议尽量使用#{}以提高安全性和性能,但在特定场景如表名、字段名拼接时需谨慎处理防止SQL注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、学习背景

二、语句过程(Mybatis)

三、过程分析

3.1 sql动态解析

3.2 sql 预编译

3.3 DBMS(执行)

四、sql字符串拼接

4.1 ${}写法

4.2 #{}写法

五、引号问题

5.1 #{}带引号

5.2 ${}不带引号

六、sql注入问题

实例1:字段名注入

实例2:表名注入

七、总结

学习资料

引号说明


一、学习背景

很多Java面试面试官都会问到Mybatis相关问题,其中#{}、${}的使用区别最为常见,大多人都会回答:

#{}参数带引号,而${}参数不带引号;

#{}防sql注入,${}不防sql注入。

单单两句话概括的话,个人觉得这个回答稍微有点肤浅了。具体怎么个带引号法,为什么要防sql注入,注入生效会导致什么结果也没大概说一下。

本文就从Mybatis特性之一的sql动态解析,#{}、${}解析的不同展开学习,相信一定会给你的回答再加点猛料,没时间看过程的童鞋直接拉最后看总结  ~哇~ 不过这个学习过程也很重要的,有时间就看看吧。

文章主要阐述个人对所学知识的观点,有不合理的地方,欢迎纠正补充,有大犇光顾,欢迎给点指引,蟹蟹,哈哈哈哈!!!

二、语句过程(Mybatis)

三、过程分析

3.1 sql动态解析

sql动态解析是Mybatis的重要特性之一,也是Mybatis相比其他ORM框架的优势所在。sql动态解析时,sql会被解析为BoundSql对象,此处进行动态 SQL的处理。

sql动态解析阶段,#{}、${}有不同的处理体现

#{}解析为占位符?即JDBC 预编译语句(prepared statement)的参数标记符。

select * from table_name where id= #{id};

id传参数值为字符串1,解析为:

select * from table_name where id= ?;

${}则是直接拼接不带引号的参数值到sql语句上。

select * from table_name where id=${id};

解析为:

select * from table_name where id= 1;

表明${}在sql动态解析阶段进行变量替换。

3.2 sql 预编译

数据库驱动在发送sql语句和参数给DBMS之前对sql语句进行编译,这样DBMS执行sql时,就不需要重新编译。预编译阶段,会将sql动态解析阶段#{}解析到的占位符?替换为参数值(带引号的)即变量替换。

3.3 DBMS(执行)

DBMS即Database Management System(数据库管理系统)。mapper.xml自定义的sql语句,经过动态解析阶段、预编译阶段后,得到最终要发送到DBMS执行的sql。

四、sql字符串拼接

动态sql语句进行字符串拼接时写法不同,例如模糊查询like后的字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾日三省贾斯汀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值