app开发定制公司Mybatis——#{}和${}的区别

app开发定制公司在使用的时候我们会使用到#{}和${}app开发定制公司这两个符号来为sql语句传参数,那么这两者有什么区别呢?

  1. #{}是处理,是占位符,${}是替换,是拼接符

  2. Mybatis在处理#{}的时候会将sql中的#{}替换成?号,调用PreparedStatement来赋值
    如:

select * from user where name = #{userName};
  • 1

设userName=yuze

看日志我们可以看到解析时将#{userName}替换成了

select * from user where name = ?;
  • 1

然后再把yuze放进去,外面加上单引号

  1. Mybatis在处理 的 时 候 就 是 把 {}的时候就是把 {}替换成变量的值,调用Statement来赋值
    如:
select * from user where name = #{userName};
  • 1

设userName=yuze

看日志可以发现就是直接把值拼接上去了

select * from user where name = yuze;
  • 1

这极有可能发生,下面举了一个简单的sql注入案例
这是一条用户的账号、密码数据

当用户登录,我们验证账号密码是否正确时用这个sql:

username=yyy;password=123

select * from user where username=${username} and password=${password}
  • 1

显然这条sql没问题可以查出来,但是如果有人不知道密码但是想登录账号怎么办

我们不需要填写正确的密码:

密码输入1 or 1=1,sql执行的其实是

select * from user where username='yyy' and password=1 or 1 =1
  • 1
  1. #{}的变量替换是在DBMS中、变量替换后,#{}对应的变量自动加上单引号

  2. 的 变 量 替 换 是 在 D B M S 外 、 变 量 替 换 后 , {}的变量替换是在DBMS外、变量替换后, DBMS{}对应的变量不会加上单引号

  3. 使用#{}可以有效的防止sql注入,提高系统的安全性

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发