Mybatis 中 sql 语句的占位符 #{} 和 ${}
2024-10-12 17:58:04
#{} 表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换。#{} 可以有效防止 sql注入。 #{} 可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{} 括号中可以是 value 或其它名称。
${} 表示拼接sql串,通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,不能防止 sql 注入问题, ${} 可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${} 括号中只能是 value。
下面举个例子来说明这两个的区别:
代码上来先:
<!-- 通过ID查询一个用户 -->
<select id="findUserById" parameterType="Integer" resultType="com.msym.beans.User">
select * from user where id = #{v}
</select> <!-- //根据用户名称模糊查询用户列表
#{} select * from user where id = ? 占位符 ? == '五'
${} select * from user where username like '%五%' 字符串拼接 -->
<select id="findUserByUsername1" parameterType="String" resultType="com.msym.beans.User">
select * from user where username like '%${value}%'
</select>
<select id="findUserByUsername2" parameterType="String" resultType="com.msym.beans.User">
select * from user where username like "%"#{v}"%"
</select>
上面是 user 类对应的 user.xml 文件,用于编写 sql 语句,避免了硬编码。
id 为 findUserByUsername1 的采用的是 ${} 占位符,id 为findUserByUsername2 采用的是 #{} 占位符,
前者生成的 sql 为 select * from user where username like ‘%XXX%’;
后者生成的 sql 语句是 select * from user where username like "%"'XXX'"%",(这样的格式我还没在 sql 中写过,但是的确能 run)
(XXX 是调用该查询是传入的参数)注意这两者的不同,前者不能防止 sql 注入,后者能防止。
最新文章
- Android教程收集贴
- Python 之Ajax
- ios5 中文键盘高度变高覆盖现有ui问题的解决方案(获取键盘高度的方法)(转载)
- 【实习记】2014-09-24万事达卡bin查询项目总结
- jquery学习之旅
- osgi实战学习之路:8. Service-3之ServiceTracker
- God 1.1.1 多线程之内存可见性
- 20180117MySQL出现Waiting for table metadata lock的原因以及解决方法
- 杭电ACM 1003题
- 机器学习 - 损失计算-softmax_cross_entropy_with_logits
- 学习笔记------------解决margin塌陷
- How to fix the bug “Expected ";required";, ";optional";, or ";repeated";.”?
- python测试开发django-14.查询表结果(超详细)
- jpgraph中文使用手册之文本和字体控制教程
- 题解 P3870 【[TJOI2009]开关】
- LeetCode 1. Two Sum (JavaScript)
- ie8下a标签中的图片出现边框
- Mysql root密码忘记的解决办法
- php特级课---3、常用的网站加速技术有哪些
- HDU 2108 Shape of HDU (判断是不是凸多边形 叉乘)
热门文章
- 有限差分法解矩形波导内场值、截止频率 MATLAB
- tarjan 强连通分量
- style.attr,currentStyle,getComputedStyle获取元素css
- 20155302 2016-2017-2 《Java程序设计》第十周学习总结
- BZOJ4034_树上操作_KEY
- springboot 中根据数据库表生成所有表的model,mapper和xml文件
- 2017";百度之星";程序设计大赛 - 初赛(A) 小C的倍数问题
- 查询表的大小(mysql)
- TensorFlow深度学习实战---图像数据处理
- Python不生成HTMLTestRunner报告-转载学习