Mybatis中#{}和${}的区别是什么

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…


一、文章序言

开局分享一波干货欢迎打卡!

在这里插入图片描述

SSM框架常考面试题汇集

JAVA常见基础面试题汇集


在Mybatis面试中常涉及到关于#{}和${}的区别

1、#{}是预编译处理,$ {}是字符串替换。

2、MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用PreparedStatement的set方法来赋值;MyBatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。

3、使用 #{} 可以有效的防止SQL注入,提高系统安全性。


二、业务场景

select * from user where id= "1";

上述 sql 中,我们希望对应的id可以变化,根据不同的id查询出不同的学生,在 Mapper.xml文件中使用如下的 sql 可以实现动态传递参数 id:

关于#的使用

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

当传来参数id=2的时候,解析为:

select * from user where id= ?;

关于$的使用

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

当传来参数id=2的时候,解析为:

select * from user where id = "2";

小结: ${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。

案例测试:

   <select id="getUsersByWhere" resultType="com.example.cwgl.entity.UserInfo" parameterType="com.example.cwgl.entity.UserInfo">
        SELECT *, rolename FROM user left join role on role.roleid = user.roleid
        <where>
            <if test="data.username!=null">(username = #{data.username} or realname = #{data.realname})</if>
            <if test="data.roleid!=null and data.roleid!=-1">and user.roleid >= #{data.roleid}</if>
            <if test="data.houseid!=null and data.houseid.length!=0">and houseid = #{data.houseid}</if>
        </where>
        order by user.roleid asc
        limit #{beginIndex},#{pageSize}
    </select>

在这里插入图片描述

当我们使用#的时候,很明显可以看到MyBatis在处理#{}时,会将SQL中的#{}替换为?号


三、补充讲解

$ 符号一般用来当作占位符

#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值。

预编译的机制。预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。

<select id="insertUser" parameterType="User">
	INSERT INTO users(name,age) values(#{name},#{age})
</select>

${}的使用场景:先在配置文件中定义好变量,再在conf.xml中如下使用:

<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbcDriver}" />
<property name="url" value="${jdbcUrl}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>

我们最开始接触Java时候SSM项目配置数据库连接就用户的上述方式

${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${jdcDriver}会被静态替换为com.mysql.jdbc.Driver。

在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。

#方式能够很大程度防止sql注入;$方式无法防止Sql注入。

一般能用#的就别用$。MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。

非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤️ 分享👥 留言💬thanks!!!

2021年2月22日20:14:57 愿你们奔赴在自己的热爱里!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员可乐丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值