首页 > 其他分享 >Mybatis中#{}与${}的区别

Mybatis中#{}与${}的区别

时间:2022-10-29 19:11:24浏览次数:45  
标签:name 区别 user SQL Mybatis password where select

Mybatis中#{}与${}的区别

#{}

#{} 表示一个占位符?,采用preparedStatement给占位符设置值,自动进行java类型和jdbc类型转换,进行预编译处理,#{}可以有效防止sql注入(预编译是提前对SQL语句进行编译,而其后注入的参数将不会再进行编译)

${}

${} 表示字符串替换,通过${}可以将parameterType或实体,传入的内容拼接在sql中且不进行jdbc类型转换

代码示例

select * from user where user_name = #{userName} and user_password = #{password}

使用#{}时,会进行jdbc类型转换,根据属性 自动加上单引号

select * from user where user_name = 'admin' and user_password = '123456';
select * from user where user_name = ${userName} and user_password = ${password}

${}不会进行jdbc类型转换,只是简单的字符串替换,不会加上单引号,会有sql注入的风险

select * from user where user_name = admin and user_password = 123456;

SQL注入举例说明

SQL注入就是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作。比如说:在登录过程中,利用上面的语句到数据库中查找用户名/密码是否存在,如果存在就登录成功,如果不存在就登录失败。

若使用${},恶意用户在表单中的用户名文本框中输入的是'admin'
密码框中输入的是 ' ' or 1 = 1 加了单引号引号和一个恒成立的条件,那么,传到数据库中的sql就是:

select * from user where user_name = 'admin' and user_password = ' ' or 1=1

登录成功,该恶意用户是可以登录系统的! 这就是SQL注入,恶意攻击

而如果使用#{}是不会出现这种情况的,#{}默认会给输入的值加上引号,密码错误,登录失败:

//sql错误
select * from user where user_name = ''admin'' and user_password ='' '' or 1=1'

标签:name,区别,user,SQL,Mybatis,password,where,select
From: https://www.cnblogs.com/xiaopiao/p/16839425.html

相关文章

  • 【linux】rpm和src.rpm、rpm和noarch.rpm的区别
    目录​​简略​​​​前言​​​​一、rpm和src.rpm文件类型区别及联系​​​​二、rpm文件名称那么长,分别是什么意思?​​​​三、如何本地编译并安装rpm包?​​​​四、如何......
  • MyBatis初学心得
    一、MyBatis是一个优秀的大型持久层框架,用于简化JDBC的开发,javaee分为表现层、业务层和持久层三层架构。框架是一个半成品软件。  ......
  • src、href区别,link、@import区别
    一、src与href·src(source)和href(超文本引用),都用于引用外部资源,如图片、音频、css文件、js文件等;·src(source),指向外部资源的位置,会将资源下载后嵌入到所处标签位置中。在......
  • 彻底弄懂StringBuffer与StringBuilder的区别
    彻底弄懂StringBuffer与StringBuilder的区别一问道StringBuffer与StringBuilder的区别,张口就来StringBuffer是线程安全的,因为它相关方法都加了synchronized关键字,String......
  • python系列:paramiko中invoke_shell和exec_command的区别
    目录​​exec_command​​​​invoke_shell​​exec_command只能运行一次,命令执行完成后channel将关闭,不能被复用。invoke_shell使用get_pty()获取一个伪终端后,需要使用invo......
  • c语言和python区别
    除了在语法使用上面的区别外,c语言和python的本质区别可能是在其语言性质上面的区别。简单来说C语言是编译语言,Python是脚本语言。1.C语言是编译型语言,经过编译后,生成机器码,......
  • python 中 import 和 from import 两种导入库的区别
    在学习python的时候,自己发现平时导入第三库的时候,有时候会使用from的方式,有的时候会直接使用import的方式去导入第三方库,最近探究他们之间的区别,区别如下第一种使用f......
  • for in 和 for of 的区别
    forin遍历的是数组的索引(index)而forof遍历的是数组元素值(value0) //forinvarobj={a:1,b:2,c:3}for(letkeyinobj){console.log(key)}//a......
  • 在 MyBatis 中使用 <、<= 等特殊符号
    在实际的开发中,经常会遇到一些场景,比如查询小于某个时间,或者是查询小于某个年龄等。这个时候就需要在MyBatis的XML文件中使用一些>=、<=等符号,但是如果直接使用的话......
  • Python 实例方法、类方法、静态方法之间的区别及实例说明
    类方法定义:使用装饰器@classmethod。第一个参数为“cls”(也可为self),通过它来传递类的属性和方法(不能传实例的属性和方法,即使第一个参数为self,传递的也是类的属性和方......