mybatis的#{}占位符和${}拼接符

#{}占位符:占位

使用#{}意味着使用的预编译的语句,即在使用jdbc时的preparedStatement,sql语句中如果存在参数则会使用?作占位符,我们知道这种方式可以防止sql注入,并且在使用#{}时形成的sql语句,已经带有引号,例,select * from table1 where id=#{id} 在调用这个语句时我们可以通过后台看到打印出的sql为:select * from table1 where id=‘2’ 加入传的值为2.也就是说在组成sql语句的时候把参数默认为字符串。

如果传入的是基本类型,那么#{}中的变量名称可以随意写
如果传入的参数是pojo类型,那么#{}中的变量名称必须是pojo中的属性.属性.属性…

${}拼接符:字符串原样拼接
如果传入的是基本类型,那么${}中的变量名必须是value
如果传入的参数是pojo类型,那么${}中的变量名称必须是pojo中的属性.属性.属性…
注意:使用拼接符有可能造成sql注入

使用${}时的sql不会当做字符串处理,是什么就是什么,如上边的语句:select * from table1 where id=${id} 在调用这个语句时控制台打印的为:select * from table1 where id=2 ,假设传的参数值为2

从上边的介绍可以看出这两种方式的区别,我们最好是能用#{}则用它,因为它可以防止sql注入,且是预编译的,在需要原样输出时才使用${},如,

select * from ${tableName} order by ${id} 这里需要传入表名和按照哪个列进行排序 ,加入传入table1、id 则语句为:select * from table1 order by id

如果是使用#{} 则变成了select * from ‘table1’ order by ‘id’ 我们知道这样就不对了。

另,在使用以下的配置时,必须使用#{}

<select id="selectMessageByIdI" parameterType="int" resultType="Message">
    select * from message where id=#{id};
</select>

在parameterType是int时,sql语句中必须是#{}。
<!-- 
id:sql语句唯一标识 
parameterType:指定传入参数类型
resultType:返回结果集类型
#{}占位符:起到占位作用,如果传入的是基本类型(string,long,double,int,boolean,float等),那么#{}中的变量名称可以随意写.
#{}:如果传入的是pojo类型,那么#{}中的变量名称必须是pojo中对应的属性.属性.属性.....
-->
<select id="findUserById" parameterType="int" resultType="cn.itheima.pojo.User">
       select * from user where id=#{id}
</select>
<!-- 
${}拼接符:字符串原样拼接,如果传入的参数是基本类型(string,long,double,int,boolean,float等),
那么${}中的变量名称必须是value
${}:如果传入的参数是pojo类型,那么`${}`中的变量名称必须是pojo中的属性.属性.属性...
注意:拼接符有sql注入的风险,所以慎重使用
 -->
<select id="findUserByUserName" parameterType="string" resultType="user">
    select * from user where username like '%${value}%'
</select>


  •  
MyBatis中,#{}${}是两种不同的占位符使用方式。 #{}用于传递参数,它会将传递的参数值安全地替换到SQL语句中,以防止SQL注入攻击。在SQL执行过程中,#{}会将参数值进行预编译处理,生成一个占位符,并使用PreparedStatement对象来执行SQL语句,这样可以提高执行效率。因此,#{}在编写动态SQL时是更安全推荐的方式。 ${}则是直接将参数拼接SQL语句中,没有经过预编译处理。这种方式适用于一些特殊情况,比如在表名、列名等需要动态拼接的地方。但是,由于没有预编译处理,可能存在SQL注入的风险,所以在使用${}时需要特别小心,确保传递的参数是可信的。 综上所述,#{}${}的使用场景可以总结如下: - 使用#{}时,适用于传递参数的情况,可以提高SQL执行效率,并且避免SQL注入攻击。 - 使用${}时,适用于一些需要动态拼接的场景,但需要注意防止SQL注入,确保传递的参数是可信的。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Mybatis #$获取参数值的区别以及@param的使用场景](https://blog.youkuaiyun.com/Tom098/article/details/103381901)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Mybatis#$的区别](https://blog.youkuaiyun.com/m0_52388979/article/details/125720091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值