Mybatis中的#{}和${}的区别?
1,首先Mybatis中的#{}与${}到底有什么区别?
#{}:表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。
如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。“%”#{name}”%”
${}:表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,
如果parameterType传输单个简单类型值,${}括号中只能是value。
#{}是预编译处理,$ {}是字符串替换。
预编译的机制。预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。
我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。
其实,区别就是如果使用#{},会将{}里面的传入的值自动解析成为带引号的值,比如:
select count(1) from tb_user where username = #{username} and password = #{password}
假如,此时传入username传入的值为admin,password传入的值为123456,那么最后的sql就是:
select count(1) from tb_user where username = 'admin' and password = '123456';
会解析成字符串,而${}就会这样解析:
select count(1) from t_user where username = admin and password = 123456;
显然,这是一个错误的sql语句,那么,什么叫SQL注入呢?为什么#{}可以有效的防止sql注入呢?
2,什么是SQL注入?
SQL注入就是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作
比如说,在登录过程中,利用上面的语句到数据库中查找用户名/密码是否存在,如果存在就登录成功
而如果不存在就登录失败,如果说你后台使用的是${},恶意用户在表单中的用户名文本框中输入的是'admin'
密码框中输入的是' ' or 1 = 1 加了一引号和一个恒成立的条件,那么,传到数据库中的sql就是:
select count(1) from t_user where user_name = 'admin' and user_password = ' ' or 1=1
如果程序没有做其他的校验,此时,该恶意用户是可以登录系统的! 这就是SQL注入,恶意攻击
而如果使用#{}是不会出现这种情况的,#{}默认会给输入的值加上引号,但是使用#{}在其他场景下并不适用
比如要使用到排序 order by #{} 传入的参数应是表对应字段名,但是加上引号后就会解析成
order by 'age' 这样就达不到排序的目的,而此时如果使用${}就可以达到排序的目的
即,sql解析成 order by age,根据age排序
Mybatis中的#{}和${}的区别?的更多相关文章
- Mybatis中的#与$的区别
一.对比场景 场景:数据库分表时,需要将分表的表序号传入的sql中. SpringBoot中使用注解如下: @Insert("insert into collect_#{tblNum}(id ...
- 【mybatis】mybatis中 的# 和 $的区别
mybatis中 的# 和 $的区别 参考地址:https://www.cnblogs.com/sxdcgaq8080/p/10869144.html
- mybatis中的#和$的区别 以及 防止sql注入
声明:这是转载的. mybatis中的#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sq ...
- [转]MyBatis中resultType与resultMap区别
MyBatis中关于resultType和resultMap的具体区别如下: MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap.resu ...
- 【mybatis】从一个错误,看mybatis中的#和$的区别
事情的发展是这样的: 因为一个需求,需要在java中拼接出一个完整的sql语句,然后将整条sql语句传递给mybatis执行. mapper.java是这样的: int insertMaster(Wo ...
- 浅析mybatis中${}和#{}取值区别
mybatis作为一个轻量级的ORM框架,应用广泛,其上手使用也比较简单:一个成熟的框架,必然有精巧的设计,值得学习. 在使用mybatis框架时,在sql语句中获取传入的参数有如下两种方式: ${p ...
- Mybatis中resultMap与resultType区别
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultM ...
- mybatis中#和$符号的区别
mybatis做为一个轻量级ORM框架在许多项目中使用,因其简单的入门受到了广大开发者的热爱.在近期项目中再做一个相关的开发,碰到了#.$符号这样的问题,之前没怎么注意过,通过学习之后,有了点感悟,分 ...
- mybatis中#和$符号的区别(转)
mybatis做为一个轻量级ORM框架在许多项目中使用,因其简单的入门受到了广大开发者的热爱.在近期项目中再做一个相关的开发,碰到了#.$符号这样的问题,之前没怎么注意过,通过学习之后,有了点感悟,分 ...
随机推荐
- webpack实践(一)- 先入个门
一.前言 webpack是个啥呢?看官网的这段描述. webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler) 在我以前做纯html.css. ...
- Java内存大家都知道,但你知道要怎么管理Java内存吗?
前言 深入研究Java内存管理,将增强你对堆如何工作.引用类型和垃圾回收的认识. 你可能会思考,如果你使用Java编程,关于内存如何工作你需要了解哪些哪些信息?Java可以进行自动内存管理,而且有一个 ...
- 70道阿里百度高频Java面试题(框架+JVM+多线程+算法+数据库)
基础与框架 1.String类能被继承吗,为什么 2.String,Stringbuffer,StringBuilder的区别? 3.ArrayList和LinkedList有什么区别 4.类的实例化 ...
- java—将数据库读取的list转tree
一.引言 有时候我们从数据库中读取出了一个表的数据,比如存储的是中国的省市县的ID.名称与父节点ID,读出来的数据并不是前台想要的,这个时候我们要想法处理一下都出来的list,将它变为一个树. 比如直 ...
- 《Java基础知识》Java集合(Map)
Java集合主要由2大体系构成,分别是Collection体系和Map体系,其中Collection和Map分别是2大体系中的顶层接口. 今天主要讲:Map主要有二个子接口,分别为HashMap.Tr ...
- Linux下shell通用脚本启动jar(微服务)
Linux下shell通用脚本启动jar(微服务) vim app_jar.sh #!/bin/bash #source /etc/profile # Auth:Liucx # Please chan ...
- C# read file to bytes,File.ReadAllFiles,File.Open(),BinaryReader
using System; using System.Text; using System.IO; namespace ConsoleApplication15 { class Program { s ...
- Spring-web-security Issue (Access is denied. User must have one of the these roles: ACTUATOR)
前提条件(Prerequisite) 1.你的项目里引进了Spring web security <dependency> <groupId>org.springframewo ...
- 关于iOS引导页图层的相关属性类
关键字:CABasicAnimation 参考链接:https://blog.csdn.net/Dwarven/article/details/42492199 Layer.mask属性用法: htt ...
- com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
1.错误显示 com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details log提示:Generate Si ...