mysql中#{}和${}的区别详解
作者:拒绝熬夜啊 发布时间:2024-01-12 21:37:17
#{}
会将传入的数据当成一个字符串,会对自动传入的数据加一个双引号
order by #{userId}
这里假如userId = 111,那么解析成sql时会变成 order by "111"
这里如果userId = idStr,那么解析成sql时会变成 order by "idStr"
${}
会将传入的数据直接显示生成在sql中
order by #{userId}
这里假如userId = 111,那么解析成sql时会变成 order by 111
这里如果userId = idStr,那么解析成sql时会变成 order by idStr
#方式能够很大程度防止sql注入;$方式无法防止Sql注入。
$方式一般用于传入数据库对象,例如传入表名。
一般能用#
的就别用$
。MyBatis排序时使用order by 动态参数时需要注意,用$
而不是#
。
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}; 这里MyBatis不会修改或转义字符串。
例子:
在没有做防Sql注入的时候,我们的Sql语句可能是这么写的:
<select id="fetchStudentByName" parameterType="String" resultType="entity.StudentEntity"> SELECT id,name,age FROM student WHERE name = '${value}' </select>
但如果我们对传入的姓名参数做一些更改,比如改成anything’ OR ‘x’='x,那么拼接而成的Sql就变成了
SELECT id,name,age FROM student WHERE name = 'anything' OR 'x'='x'
库里面所有的学生信息都被拉了出来,是不是很可怕。原因就是传入的anything’ OR ‘x’='x和原有的单引号,正好组成了 ‘anything’ OR ‘x’='x’,而OR后面恒等于1,所以等于对这个库执行了查所有的操作。
防范Sql注入的话,就是要把整个anything’ OR ‘x’='x中的单引号作为参数的一部分,而不是和Sql中的单引号进行拼接
使用了#即可在Mybatis中对参数进行转义
<select id="fetchStudentByName" parameterType="String" resultType="entity.StudentEntity"> SELECT id,name,age FROM student WHERE name = #{name} </select>
我们看一下发送到数据库端的Sql语句长什么样子。
SELECT id,name,age FROM student WHERE name = 'anything\' OR \'x\'=\'x'
来源:https://blog.csdn.net/weixin_43296313/article/details/122880292


猜你喜欢
- 当感觉mysql性能出现问题时,通常会先看下当前mysql的执行状态,使用 show processlist 来查看,例如:其中state状
- 代码如下: document.getElementById("btnConnect").value = "连接
- pygal的安装和简介,大家可以参阅《pip和pygal的安装实例教程》,下面看看通过pygal实现绘制雷达图代码示例。雷达图(Radar)
- 需要在两个文件中实现:首先,在talker.asp(在线名单)中做如下处理:<%p1=trim(application("v
- 看代码吧~def find_all_index(arr, item): return [i for i, a in
- 本文主要包括三大方面,大家仔细学习。1、导航栏中的表单导航栏中的表单不是使用 Bootstrap 表单 章节中所讲到的默认的 class,它
- 需要用到的库有selenium,还需要安装Chrome浏览器驱动,具体如何安装我就不详述了在这里我模拟了csdn的登录过程**1**.首先打
- </pre><pre name="code" class="javascript"
- 本文实例讲述了python实现线程池的方法。分享给大家供大家参考。具体如下:原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后
- 运用webbrowser库中的一个函数实现自动打开浏览器:webbrowser.open(http://blog.csdn.net/ares
- 1 通过System.DBNull判断,网上大部分都使用这个方法。DataTable dt;
- f-string,亦称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化
- 前言在写波段配准相关代码时经常需要用到tif影像的波段合成和分解,虽然可以用ENVI才处理,但是每次都要打开再设置一些参数有些麻烦,所以本着
- 在上篇文章给大家介绍了Bootstrap的基础知识,接下来通过本文给大家介绍我们可以在http://getbootstrap.com下载bo
- 注意:localtime获取的年份是相对于1900的偏移,需要加上1900,而localtime获取的month范围是0-11,需要加1。#
- 一、前言三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学
- 列表解析——用来动态地创建列表[expr for iter_var in iterable if cond_expr]例子一:map(lam
- 大家好,今天在写代码的时候,遇到了这样一种情况。我有如下所示的几个类用来存放程序配置(其实当做命名空间来用,同时感觉能够继承方便一点),im
- 使用JS对Json数据的处理,项目遇到需要对Json数据进行相关操作,比如增删改操作,本以为会比较难,网上搜索下,发现还是比较简单的,贴一段
- 一、下载安装官网下载社区版dmg安装文件: https://dev.mysql.com/downloads/mysql/1、执行安装文件,按