mybatis中的#{}和${}区别

1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.
  
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
  
3. #方式能够很大程度防止sql注入。
  
4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名.
  
6.一般能用#的就别用$.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

mybatis本身的说明:

String SubstitutionBy default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set thevalues safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almostalways preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. Forexample, for ORDER BY, you might use something like this:ORDER BY ${columnName}
Here MyBatis won't modify or escape the string.NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads
to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or
always perform your own escapes and checks.

从上文可以看出:

1.使用#{}格式的语法在mybatis中使用Preparement语句来安全的设置值,执行sql类似下面的:

PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);

这样做的好处是:更安全,更迅速,通常也是首选做法。

而且#{}格式的sql能够预编译,能再内存中保存sql语法,不用重新组装sql语法。

2.不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

此时MyBatis 不会修改或转义字符串。

这种方式类似于:

  Statement st = conn.createStatement();ResultSet rs = st.executeQuery(sql);

这种方式的缺点是: 以这种方式接受从用户输出的内容并提供给语句中不变的字符串是不安全的,会导致潜在的 SQL 注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验。

prepareStatement的预编译和防止SQL注入:

看这里https://blog.csdn.net/qq_43842093/article/details/121344931

mybatis中的#{}和${}区别,和使用场景相关推荐

  1. 【MybBatis细节篇】MyBatis中#{}和${}的区别

    [MybBatis细节篇]MyBatis中#{}和${}的区别 #{} 和 ${} 的区别 #{} 和 ${} 的实例:假设传入参数为 1 #{} 和 ${} 的大括号中的值 单个参数的情形 #{} ...

  2. MyBatis中#{}和${}的区别

    ------------------------siwuxie095 MyBatis 中 #{} 和 ${} 的区别 1.在 MyBatis 的映射配置文件中,动态传递参数有两种方式: (1)#{} ...

  3. Mybatis 中$与#的区别

    1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select i ...

  4. mybatis 中#与$的区别

    2019独角兽企业重金招聘Python工程师标准>>> MyBatis中#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #u ...

  5. mybatis中#与$的区别

    mybatis中#与$的区别 MyBatis中使用parameterType向SQL语句传参,parameterType支持的类型可以是基本类型int,String,HashMap和java自定义类型 ...

  6. 从印度兵力分布聊聊Mybatis中#和$的区别

    文章目录 简介 举个例子 查询举例 #{id}的特点 ${id}的特点 总结 简介 大家在使用Mybatis的过程中可能都会自己去写SQL语句,并且需要向SQL语句传入参数. 但是在Mybatis中, ...

  7. MyBatis 中 #{} 和 ${} 的区别看完这篇文章一目了然

    我们知道 MyBatis 中对于参数的赋值有两种方式, 一种是使用 #{}, 一种是使用 ${}, 这两种参数赋值的方式对于有些情况都可以正常使用, 但是针对某些场景, ${} 却会报错. 本篇文章主 ...

  8. spring中@param和mybatis中@param使用区别

    spring中@param /*** 查询指定用户和企业关联有没有配置角色* @param businessId memberId* @return*/int selectRoleCount(@Par ...

  9. mybatis中#{}和${}的区别及order by的sql注入问题

    mybatis的#{}和${}的区别以及order by注入问题 原文  http://www.cnblogs.com/chyu/p/4389701.html 前言略,直奔主题.. #{}相当于jdb ...

最新文章

  1. devops 成长路线
  2. OpenTSDB介绍——基于Hbase的分布式的,可伸缩的时间序列数据库,而Hbase本质是列存储...
  3. Codeforces 671E Organizing a Race (贪心、线段树)
  4. T-SQL 之 多表联合更新
  5. python知识点智能问答_基于知识图谱的智能问答机器人
  6. 佳能g3800故障灯说明书_佳能打印机故障如何维修 佳能打印机故障维修方法【介绍】...
  7. linux切换到字符界面stemctl,CentOS7两种模式
  8. 使用 Strace 和 GDB 调试工具的乐趣
  9. unity3d双面材质_[转]unity3d中创建双面材质
  10. 开火锅店的明星们,什么时候才能不道歉?
  11. 通讯录获取源码_[源码和文档分享]基于Java语言的C/S模式通讯录备份和查询软件...
  12. Java 反射机制浅析
  13. QT 对话框不在任务栏显示
  14. OpenWrt 安装中文语言包
  15. python计算方位角_python实现两个经纬度点之间的距离和方位角
  16. 已知起始点坐标、目的地方位角,计算沿着测地线飞行一定距离到达的目的地坐标
  17. 学习C语言篇之网络编程操作
  18. 病毒木马查杀实战第027篇:“白加黑”恶意程序研究(中)
  19. 数据结构中的有序和无序
  20. matlab中omg什么意思,英文聊天中omg,jk,lol,Lmao是什么意思

热门文章

  1. 学徒学计算机,那个有能力的高人愿意收我做学徒啊,我是学计算机的
  2. mysql使用技巧_MySQL使用不得不看的几个小技巧
  3. stringreader_Java StringReader skip()方法与示例
  4. python requests和urllib_Python——深入理解urllib、urllib2及requests(requests不建议使用?)...
  5. python—高阶函数
  6. css 百分比 怎么固定正方形_css样式写出三角形,宽高自适应的正方形,扇形!...
  7. linux字符设备驱动在哪里设置,从点一个灯开始学写Linux字符设备驱动!
  8. 互联网传真 传真指令_传真的完整形式是什么?
  9. Java即时类| 带示例的compareTo()方法
  10. 忘记MySQL密码怎么办?一招教你搞定!