【MyBatis】${}和#{}的区别

在 MyBatis 中,${} 和 #{} 是两种不同的参数占位符,用于在 SQL 语句中替换参数的值。

${}:

${}(美元符号占位符):

  1. ${} 是简单字符串替换,它会将参数原样替换到 SQL 语句中。
  2. 使用 ${} 时,要注意 SQL 注入的风险,因为参数值会直接替换到 SQL 语句中,可能造成安全问题。
  3. ${} 不会对参数进行预编译,可能导致 SQL 语句在数据库中被重复编译,性能稍低。
<!-- 使用 ${} 进行简单字符串替换 -->
<select id="getUserById" resultType="User">
    SELECT * FROM users WHERE id = ${userId}
</select>

该段代码使用 ${userId} 时,如果 userId 是字符串类型的参数,SQL 语句会被替换为 SELECT * FROM users WHERE id = ‘abc’。

#{}

#{}(井号符号占位符):

  1. #{} 是预编译的占位符,它会对参数进行安全处理,自动添加必要的转义字符,防止 SQL 注入。
  2. 使用 #{} 时,MyBatis 会将参数值作为预编译语句的参数传递给数据库,提高了 SQL 的执行效率和安全性。
  3. #{} 支持自动类型转换,例如将 Java 的 Date 类型转换为数据库的日期类型。
<!-- 使用 #{} 进行预编译占位 -->
<select id="getUserById" resultType="User">
    SELECT * FROM users WHERE id = #{userId}
</select>

该段代码使用 #{userId} 时,如果 userId 是字符串类型的参数,MyBatis 会将 SQL 语句转换为 SELECT * FROM users WHERE id = ‘abc’,同时进行了安全处理。

总结

  • #{}是预编译,用?作为占位符。${}是字符串替换,直接拼接
  • Mybatis在处理#{}的时候,会将sql当中的#{}替换成?并且调用PreparedStatement来赋值
  • #{}是自带引号的
  • 由于${}是直接把传字符串,所以会有安全问题,比如在输入密码时输入:123 or 1=1,这样子就算密码不是123也能进去

补充

.在Spring框架中的配置文件可以使用"${}"引用配置属性,实现动态配置。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="url" value="${jdbc.url}" />
    ...
</bean>
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

去码头整点薯条​⁢⁢⁢⁡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值