初探#{}和${}
Mybatis中#{}和${}是传递查询参数的两种方式,首先看下他们的使用方式,这里以查询姓名中包含字符“J”的数据列表为例。
现有一张User表,结构和数据如下:
定义Dao接口:
定义Mapper文件:
执行单元测试:
查看结果,两种方式都查询出了两条记录,都实现了需求。
SQL注入
#{}和${}虽然都能实现查询,但区别还是有的,最大区别是${}方式可能导致SQL注入问题。
看个例子,把上面的查询条件改动下,在条件后加入 or 1=1 -- ,再分别看下结果。
修改查询条件:
查看执行结果,可以看到#{}方式查询结果为0条,${}方式查出了所有记录。
细思极恐啊,如果采用${}方式执行update或delete操作,那整张表数据都会受到影响。
#{}和${}区别
查看mysql执行log日志,拿到两种方式执行的sql语句如下:
对比发现,虽然两种方式查询条件传入的字符串一样,但是Mysql执行时生成的语句并不一样,${}是字符串替换,而#{}是预处理,预处理时会对特殊字符进行转义操作。
Mybatis在处理${}时,就是把${}值直接替换成变量值。而在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值。
因此,使用#{}可以有效的防止SQL注入,提高系统安全性。
应用场景
我们已经知道#{}可以有效的防止SQL注入,那为什么还要有${}方式呢?
既然存在,那肯定有用武之地,${}采用字符串拼接方式,还是举个例子来介绍它的使用场景。
例如,针对查询时表名不确定的情况,需要在查询时将表名通过参数传递进来,分别使用两种方式测试下。
Mapper文件如下:
执行单元测试:
查看结果,${}方式可以查询出结果,而#{}方式抛出异常,这种情况下只能选择${}方式查询。
总 结
#{}针对输入字符串进行了转义过滤处理,能够防止SQL注入,适用于给SQL语句的where条件传值的使用场景;
${}设计就是用于参与SQL的语法生成,适用于需要通过传递值来拼接SQL语句的场景。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/129579.html
摘要:跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来期间也没有准备充分,到底是因为技术原因影响自己的发展,偏移自己规划的轨迹,还是钱给少了,不受重视。 跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技...
摘要:执行没有,批处理不支持,将所有都添加到批处理中,等待统一执行,它缓存了多个对象,每个对象都是完毕后,等待逐一执行批处理。 Mybatis常见面试题 #{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是预编译处理,${}是字符串替换。 使用#{}可以有效的防止...
摘要:容器自动完成装载,默认的方式是这部分重点在常用模块的使用以及的底层实现原理。 对于那些想面试高级 Java 岗位的同学来说,除了算法属于比较「天方夜谭」的题目外,剩下针对实际工作的题目就属于真正的本事了,热门技术的细节和难点成为了主要考察的内容。 这里说「天方夜谭」并不是说算法没用,不切实际,而是想说算法平时其实很少用到,甚至面试官都对自己出的算法题一知半解。 这里总结打磨了 70 道...
摘要:在动态解析阶段,和会有不同的表现解析为一个预编译语句的参数标记符。其次,在预编译之前已经被变量替换了,这会存在注入问题。预编译语句对象可以重复利用。默认情况下,将对所有的进行预编译。总结本文主要深入探究了对和的不同处理方式,并了解了预编译。 mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: sele...
摘要:我在面试前针对基础也花了不少的时间,期间也将自己写过的博文粗略地刷了一遍,同时也在网上找了不少比较好的资料部分是没看完的。看面试题也是校验自己是否真正理解了这个知识点,也很有可能会有新的收获。 一、前言 只有光头才能变强 回顾前面: 广州三本找Java实习经历 上一篇写了自己面试的经历和一些在面试的时候遇到的题目(笔试题和面试题)。 我在面试前针对Java基础也花了不少的时间,期间也将...
摘要:是最流行的关系型数据库管理系统之一,在应用方面,是最好的,关系数据库管理系统应用软件。是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 本章主要是对MyBatis-Plus的初步介绍,包括一些背景知识、环境搭建、初步使用等知识和例子。对于背景知识,主要包含对MyBatis-Plus的特性介绍、为什么使用MyB...
阅读 1346·2023-01-11 13:20
阅读 1684·2023-01-11 13:20
阅读 1132·2023-01-11 13:20
阅读 1858·2023-01-11 13:20
阅读 4100·2023-01-11 13:20
阅读 2704·2023-01-11 13:20
阅读 1385·2023-01-11 13:20
阅读 3597·2023-01-11 13:20