${} 和 #{}的问题

1
2
3
4
5
6
7
<select id="selectPostOrder" resultMap="postOrderResultMap">
  SELECT id, cid, lid, univalent, (account-nowaccount) as naccount, pclass, finaltime
  FROM postorder
  WHERE cid = #{id} and (account-nowaccount) > 0 and id not in (
    select pid from optest
  ) and #{select} = '${input}'
</select>

  

  • #{} 占位符:使用 #{} 占位符来表示动态传入的参数,例如 #{id} 和 #{select}。在执行 SQL 语句之前,MyBatis 会将 #{} 占位符替换成相应的参数值,并进行参数类型转换和 SQL 注入防范。
  • ${} 表达式:使用 ${} 表达式来表示字符串拼接和替换。在执行 SQL 语句之前,MyBatis 会将 ${} 表达式替换成相应的字符串,并将其嵌入到 SQL 语句中。需要注意,在使用 ${} 表达式时,传入的参数值不会进行参数类型转换和 SQL 注入防范,因此需要特别小心避免 SQL 注入攻击。

例如,假设调用该查询语句时传入的参数为 id=1select='name' 和 input='北京',则执行的 SQL 语句为:

1
2
3
4
5
SELECT id, cid, lid, univalent, (account-nowaccount) as naccount, pclass, finaltime
FROM postorder
WHERE cid = 1 and (account-nowaccount) > 0 and id not in (
  select pid from optest
) and 'name' = '北京'

  

其中,将 #{id} 和 #{select} 占位符替换成相应的参数值,并将 ${input} 表达式替换成字符串 '北京',并将其嵌入到 SQL 语句中。

需要注意的是,使用 ${} 表达式时,可能存在 SQL 注入攻击的风险,因此应该避免在 SQL 语句中嵌入动态生成的参数值,或者使用 MyBatis 提供的转义工具来对参数值进行转义,以提高应用安全性。

posted @   青竹之下  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2022-04-12 自然语言处理入门02
2021-04-12 springmvc07
点击右上角即可分享
微信分享提示