Mybatis 的表兄弟 #, $ 的区别

编程入门 行业动态 更新时间:2024-10-25 02:19:44

Mybatis 的<a href=https://www.elefans.com/category/jswz/34/1692803.html style=表兄弟 #, $ 的区别"/>

Mybatis 的表兄弟 #, $ 的区别

Mapper

当 String date  = " '2019-12-10' ";

 

Mapper.xml

当使用如下查询时是查不到数据的  (String date =  "2019-12-10"  也是查不到的)

select  *  from  order where date IN (#{date});

 

修复方案 :

方法一: 

使用  $  (注意: 这是不安全的, 存在 sql 注入的风险)

select  *  from  order where date IN (${date});

 

方法二:

Mapper传入 List<String> date   后使用 foreach函数

select  *   from order where date  IN 

<foreach collection="date" item="item" index="index" open="(" close=")" separator=",">

         #{item}  

</foreach>

 

 

总结:

1、#{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,传入字符串后,会在值两边加上单引号;

2、${ }是字符串替换, MyBatis在处理${ }时,它会将sql中的${ }替换为变量的值,传入的数据不会加两边加上单引号。

注意:使用${ }会存在sql注入的风险,不利于系统的安全性!

SQL注入:就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。常见的有匿名登录(在登录框输入恶意的字符串)、借助异常获取数据库信息等

应用场合:

1、#{ }:主要用户获取DAO中的参数数据,在映射文件的SQL语句中出现#{}表达式,底层会创建预编译的SQL;

2、${ }:主要用于获取配置文件数据,DAO接口中的参数信息,当$出现在映射文件的SQL语句中时创建的不是预编译的SQL,而是字符串的拼接,有可能会导致SQL注入问题.所以一般使用$接收dao参数时,这些参数一般是字段名,表名等,例如order by ${column}。

 

 

 

 

 

更多推荐

Mybatis 的表兄弟 #, $ 的区别

本文发布于:2024-02-17 05:20:29,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1692800.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:表兄弟   区别   Mybatis

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!