mybatis中“#{}”占位符与“${}”占位符的一个区别(仅记录用)

springboot中一般为了提高安全性,都会在配置文件中配置spring.datasource.druid.filters: wall,slf4j;如下图(yml文件,格式不一样):

其中,防火墙wall是用于防止sql注入的。在实际开发过程中,可能会由内部生成sql条件并需要内部注入到mapper中,此时,使用“#”占位符时,会被防火墙拦下,导致报各种错误。

      经过试验,可有2种方案:1、去除配置文件中的“wall”属性,系统安全性会降低;2、将“#”占位符修改为“$”占位符,此时sql注入则不会被防火墙拦下。查阅资料知道,$做的是直接的字符串拼接,而“#”是采用占位符的方式,它会根据是否是字符型选择是否自行添加' '。

事例:

“#”占位符时,sql如下:

    <select id="queryUserById" resultType="User">
        <include refid="user_field"></include>
        where id = #{id}
    </select>

查询结果: “$”占位符时,sql如下:

    <select id="queryUserById" resultType="User">
        <include refid="user_field"></include>
        where id = concat("'",${id},"'")
    </select>

查询结果:

 

文章中资料参考,更多了解也可访问,我自己够用了:Mybatis学习笔记-11 取值符号$、#以及SQL注入问题_WALL-SQ的博客-CSDN博客区别1:当有@Parm("xx")指明参数名称时,对于数值型数据,#和$不存在实质性的区别,对于字符型数据,$取出的值是不会自带引号''的。数值型实验:1. 在DAO中添加方法User queryUserById(@Param("id") Integer id);2. 编写Mapper.xmlA. 采用#取值 <sql id="user_field"> select id,username,password,gender,regist_ti.https://blog.csdn.net/qq_39304630/article/details/112305787 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值