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

在SQL中引用这些参数的时候,可以使用两种方式:

#{parameterName}

${parameterName}

首先,我们说一下这两种引用参数时的区别,使用#{parameterName}引用参数的时候,Mybatis会把这个参数认为是一个字符串,并自动加上’’,例如传入参数是“Smith”,那么在下面SQL中:

Select * from emp where name = #{employeeName}
使用的时候就会转换为:

Select * from emp where name = ‘Smith’;
同时使用${parameterName}的时候在下面SQL中

Select * from emp where name = ${employeeName}
就会直接转换为:

Select * from emp where name = Smith

简单说#{}是经过预编译的,是安全的。

而${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。

#{} 这种取值是编译好SQL语句再取值
${} 这种是取值以后再去编译SQL语句
下面我们用一个实际的例子看看分别使用和是否可以防止SQL注入。

首先是使用#{}:

select * from user where account = #{account} and password = #{password}

分别测试正常传参和拼接传参:

// 使用#{} 正常传参
Map<String, Object> parameter = new HashMap<>();
parameter.put(“account”, );
parameter.put(“password”, password);
MyUser mu = ss.selectOne(“com.mybatis.mapper.UserMapper.selectUser”, parameter);
System.out.println(“返回结果:” + mu);

// 使用#{} 拼接传参
Map<String, Object> parameter_1 = new HashMap<>();
parameter_1.put("account", "201301001");
parameter_1.put("password", "111111" + "or account = 'admin' ");
MyUser mu_1 = ss.selectOne("com.mybatis.mapper.UserMapper.selectUser", parameter_1);
System.out.println("返回结果:" + mu_1);

结果如下:

img

DEBUG [http-nio-8080-exec-5] - ==> Preparing: select * from user where account = ? and password = ?
DEBUG [http-nio-8080-exec-5] - > Parameters: 201301001(String), 111111(String)
DEBUG [http-nio-8080-exec-5] - < Total: 1
返回结果:MyUser [id=17, account=201301001, password=111111, name=蒙奇D路飞]
DEBUG [http-nio-8080-exec-5] - ==> Preparing: select * from user where account = ? and password = ?
DEBUG [http-nio-8080-exec-5] - > Parameters: 201301001(String), 111111 or account = ‘admin’ (String)
DEBUG [http-nio-8080-exec-5] - < Total: 0
返回结果:null
很明显,使用#{}的时候,即使传入了恶意参数,#{}只会将其作为一个占位符的参数,如上面这个例子:

DEBUG [http-nio-8080-exec-5] - ==> Preparing: select * from user where account = ? and password = ?
DEBUG [http-nio-8080-exec-5] - > Parameters: 201301001(String), 111111 or account = ‘admin’ (String)
DEBUG [http-nio-8080-exec-5] - < Total: 0
转换为实际的SQL语句:select * from user where account = ‘201301001’ and password = ‘111111 or account = ‘admin’’
现在是使用${}:

select * from user where account = ${account} and password = ${password}

分别测试正常传参和拼接传参:

// 使用${} 正常传参
Map<String, Object> parameter = new HashMap<>();
parameter.put(“account”, “201301001”);
parameter.put(“password”, “111111”);
MyUser mu = ss.selectOne(“com.mybatis.mapper.UserMapper.selectUser2”,parameter);
System.out.println(“返回结果:” + mu);

// 使用${} 拼接传参
Map<String, Object> parameter2 = new HashMap<>();
parameter2.put("account", "201301001");
parameter2.put("password", "111111" + " or account = 'admin' ");
MyUser mu2 = ss.selectOne("com.mybatis.mapper.UserMapper.selectUser2", parameter2);
System.out.println("返回结果:" + mu2);

结果如下:

img

DEBUG [http-nio-8080-exec-18] - ==> Preparing: select * from user where account = 201301001 and password = 111111
DEBUG [http-nio-8080-exec-18] - > Parameters:
DEBUG [http-nio-8080-exec-18] - < Total: 1
返回结果:MyUser [id=17, account=201301001, password=111111, name=蒙奇D路飞]
DEBUG [http-nio-8080-exec-18] - ==> Preparing: select * from user where account = 201301001 and password = 111111 or account = ‘admin’
DEBUG [http-nio-8080-exec-18] - > Parameters:
DEBUG [http-nio-8080-exec-18] - < Total: 2
返回结果:[MyUser [id=1, account=admin, password=111111, name=管理员], MyUser [id=17, account=201301001, password=111111, name=蒙奇D路飞]]
很明显,使用${}将参数拼接后在编译成SQL语句,不能防止SQL注入,查询出了有关account=admin的额外信息,这是很危险的。

Mybatis中的#{}用于传递查询的参数,用于从dao层传递一个string参数过来(也可以是其他参数),select * from 表名 order by age=#{age}

Mybatis会把这个参数转换成一个字符串。select * from 表名 order by age=“age” 相当于jdbc中的预编译,安全。

而${}一般用于order by的后面,Mybatis不会对这个参数进行任何的处理,直接生成了sql语句。例:传入一个年龄age的参数,select * from 表名 order by ${age}

Mybatis生成的语句为 select * from 表名 order by age Mybatis不会对$传递的参数做任何处理,相当于jdbc中的另外一种编译方式。

一般我们使用#{},不使用${},原因:

会引起sql注入,${}会直接参与sql编译。会影响sql语句的预编译。

mybatis中#与$的区别相关推荐

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

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

  2. Mybatis 中$与#的区别

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

  3. mybatis 中#与$的区别

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

  4. mybatis中的#{}和${}区别,和使用场景

    mybatis中的#{}和${}区别 1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为ord ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Hadoop4.2HDFS测试报告之四
  2. JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系...
  3. 一个简单函数的反汇编分析
  4. java对象转xml jackson_五分钟Jackson入门(三) JSON数据类XML转换(附项目源码)
  5. H3C TFTP操作示例
  6. Refactoring Connection To Sql
  7. H5添加禁止缩放功能
  8. python面向对象-1方法、构造函数
  9. [vc]如何对radio按钮分组
  10. 飞秋2010下载不仅野草是如此
  11. day4作业小代码练习
  12. Flutter时间工具类封装
  13. 老年代的更新机制_如何理解Java GC机制
  14. [Java] 蓝桥杯 BASIC-8 基础练习 回文数
  15. python导入模块的常用方法_(9)python模块的定义、导入、优化,常用模块
  16. Hadoop MapReduce编程 API入门系列之倒排索引(二十四)
  17. 揭秘淘宝286亿海量图片存储与处理架构(转)
  18. 蘑菇战争2显示没有连接服务器,蘑菇战争2新手怎么玩?四步带你解决新手难关[多图]...
  19. 微信开放平台开发——网页微信扫码登录(OAuth2.0)
  20. 《人月神话》(The Mythical Man-Month)2人和月可以互换吗?人月神话存在吗?

热门文章

  1. Java 必会10大的经典算法
  2. 国民经济行业代码查询系统-公司行业代码查询
  3. ORAN专题系列-13:微服务架构在5G O-RAN RIC中的应用
  4. Qt 错误 The process was ended forcefully.
  5. Windows 11 安装Visual C++ 6.0 后运行错误无法运行解决
  6. UCI计算机工程必修专业课,想问问加州大学欧文分校计算机工程专业怎么样?
  7. 鲍广华c语言实用教程答案,C语言程序设计实用教程习题答案
  8. vba mysql 3706_EXCEL中VBA连接oracle数据库字符串“运行出现3706错误”
  9. ppt怎么转pdf?经验分享
  10. Register Form