针对"Mybatis下动态sql中##和$$的区别讲解"这个问题,下面是完整的攻略:
1. ##和$$的基本区别
1.1 ##和$$分别代表什么
Mybatis中的#{}和${}都是用来表示动态sql的。其中,#{}叫做“预编译”。#{}可以防止SQL注入攻击,是使用Mybatis的推荐方式。
在#{}中使用的参数会被自动进行占位符处理,不需要手动添加占位符。而${}叫做“静态值替换”,使用${}的时候需要手动添加占位符。
动态SQL可以使用#{}和${}来引用参数,但是二者在使用方法和特性上有很大区别。区别最大的地方就是处理方式不同。
在Mybatis中动态SQL的引用参数方式如下:
<select id="selectByColumn" resultType="com.example.model.User">
select * from user where username = #{username}
</select>
1.2 ##和$$处理sql语句的方式
对于#{}使用的参数,执行时会自动进行占位符处理,把参数值放到占位符内,然后再使用占位符构建SQL语句。
对于${}使用的参数,则不是占位符,而是直接替换成为参数值,再构建成SQL语句。
这两种处理方式的差异,直接影响到程序的安全和性能。因此,建议使用#{}进行动态SQL处理。
2. ##和$$的使用示例
下面将分别对##和$$进行示例讲解,让大家对它们的特性更为清晰明了。
2.1 ##的使用示例
二者的使用形式不同,大致可以概括为:#{}把SQL中的参数替换成“?”占位符,然后将参数值分别设置到占位符中;${}直接把参数替换为输入参数值,不做参数类型处理。
比如,在执行查询用户操作时,可能不同用户会采用不同的查询方式,查询参数也会存在许多情况。使用#{}就可以方便的处理这样的情况,具体如下:
<!-- 动态查询 -->
<select id="queryUser" resultType="com.example.model.User">
select * from user
where 1=1
<if test="username != null and username != ''">
and username like '%'||#{username}||'%'
</if>
<if test="email != null and email != ''">
and email like '%'||#{email}||'%'
</if>
</select>
使用#{},就可以通过设置不同的动态值,拼接出各种需要的SQL语句,大大降低了代码复杂度,方便了开发人员的开发工作。
2.2 $$的使用示例
使用${}的时候,需要手动添加占位符标志,在输入参数值之前加入“$”符号,典型的例子如下:
<!-- 采用$符号处理 -->
<update id="updateStatus" parameterType="com.example.model.User">
update users
set status=${status}
where user_id=${userId}
</update>
在这里,通过使用$符号,可以方便地把输入参数值替换到SQL语句中的对应位置,使代码更具可读性。
但是,使用${}时,必须注意防范SQL注入攻击,因为参数值会直接拼接到SQL语句中去。
总结
通过本文的介绍,相信各位已经理解了#{}和${}的区别:#{}搭配占位符处理参数,对于动态SQL处理来说,保持较为严谨的处理方式;而${}则不做额外的参数处理,利用自身的占位符拼接SQL语句,更具可读性。
另外,使用MyBatis时,建议尽量采用#{}来代替${}。这样可以保证SQL安全,还能达到更好的性能表现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis下动态sql中##和$$的区别讲解 - Python技术站