经常碰到这样的面试题目:#{}和${}的区别是什么?

  正确的答案是:#{}是预编译处理,${}是字符串替换。

  备注:${}是插值,插值的新认识见:http://www.mybatis.cn/archives/653.html

  (1)mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值。

  (2)mybatis在处理${}时,就是把${}替换成变量的值。

  (3)使用#{}可以有效的防止SQL注入,提高系统安全性。原因在于:预编译机制。预编译完成之后,SQL的结构已经固定,即便用户输入非法参数,也不会对SQL的结构产生影响,从而避免了潜在的安全风险。

  (4)预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。

  补充1:$符号一般用来当作占位符,常使用Linux脚本的人应该对此有更深的体会吧。例如:$1,$2等等表示输入参数的占位符,知道了这点就能很容易区分$和#,从而不容易记错了。

  补充2:有网友提问:既然$会引起sql注入,为什么有了#{}还需要有${}呢?那其存在的意义是什么?

  可以这么去理解:#{}主要用于预编译,而预编译的场景其实非常受限,而${}用于替换,很多场景会出现替换,而这种场景可不是预编译,例如:MyBatis XML配置对抗MyBatis注解的一大杀器:SQL片段,抽取可重用的SQL语句。

Reference

MyBatis常见面试题:#{}和${}的区别是什么?的更多相关文章

  1. Mybatis常见面试题

    Mybatis常见面试题 #{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是 ...

  2. Mybatis常见面试题汇总

    Mybatis常见面试题汇总 最近在复习整理Mybatis的相关知识,针对面试中的典型问题,结合相关书籍和网上相关帖子,做如下整理. ================================= ...

  3. MyBatis 常见面试题总结

    1.#{}和${}的区别是什么? 注:这道题是面试官面试我同事的. 答: ${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如${drive ...

  4. Mybatis常见面试题(转)

    Mybatis技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用Mybatis的文章,所以,一些参数使用细节略掉了,我们的目标是介绍 ...

  5. Mybatis常见面试题 一

    1.#{}和${}的区别是什么? 注:这道题是面试官面试我同事的. 答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静 ...

  6. Mybatisの常见面试题

    Mybatis -面试问题 最近准备系统的学一下Mybatis,之前只有粗略的看了下,选了十个常见的面试题 1. #{}和${}的区别是什么? #{}是预编译处理,${}是字符串替换. Mybatis ...

  7. 2020年,MyBatis常见面试题总结

    Mybatis 技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用 Mybatis 的文章,所以,一些参数使用细节略掉了,我们的目标 ...

  8. Mybatis常见面试题 三

    1.什么是mybatis? (1)mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动.创建连接.创建statem ...

  9. Mybatis常见面试题总结

    1.#{}和${}的区别是什么? ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc. ...

  10. Mybatis常见面试题 二

    1.mybatis是什么?  (1)mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动.创建连接.创建state ...

随机推荐

  1. deepseek:封装一个axios

    封装一个包含上传和下载文件功能的 axios 实例,可以提高代码的复用性和可维护性.以下是一个完整的封装示例,支持文件上传.下载.以及常规的 GET/POST 请求. 封装代码 import axio ...

  2. 文件上传fuzz工具-Upload_Auto_Fuzz

    一.工具介绍 ​ 在日常遇到文件上传时,如果一个个去测,会消耗很多时间,如果利用工具去跑的话就会节省很多时间,本Burp Suite插件专为文件上传漏洞检测设计,提供自动化Fuzz测试,共300+条p ...

  3. Vulnhub-venom

    对于该靶机,注意利用了信息收集来的21端口和80端口,网站源码发现账户,ftp匿名登录密码猜测,维吉尼亚解密,后台管理员登录,CVE文件上传RCE漏洞利用反弹shell,提权有两中,利用版本内核提权和 ...

  4. Xshell连接VMware虚拟机中的CentOS

    步骤: 1. 检查Linux虚拟机的网络连接模式,确保它是NAT模式.(由于只在本机进行连接,所以没有选择桥接模式.当然,桥接模式的配置会有所不同,在此不做深入分析) 2. 在VMware works ...

  5. PDF转换:从Word到Excel

    一.引言 在数字化的浪潮中,PDF文件格式以其稳定性和兼容性成为了信息交流的宠儿.然而,当我们需要编辑这些PDF文件时,往往会遇到各种难题.今天,我要和大家分享的,是如何将PDF文件轻松转换成Word ...

  6. .NET Core奇技淫巧之WinForm使用Python.NET并打包

    前言 之前整了一个GZY.EFCoreCompare 的库,可以用做对比实体与数据库结构.感兴趣可以去看看,地址:GZY.EFCoreCompare 但是只能导出execl表格. 后来大佬用Pytho ...

  7. 堆排序(topk 问题)(NB)

    博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ # 比较排序 import random def sift(li, low, h ...

  8. Vmware ESXi 是免费吗?一文弄懂vSphere功能特性及ESXi与vSphere到底有什么区别和联系。

    目录 收起 一.对VMware vSphere及ESXi的相关疑问 1.Vmware vSphere 有些什么功能? 2.ESXi 是否真正免费? 3. ESXi 和 vSphere 到底有什么区别, ...

  9. 关于SIFT,GIFT在旋转不变性上的对比实验

    目录 关于SIFT,GIFT在旋转不变性上的对比实验 回顾 准确率测试 总结 核心代码 关于SIFT,GIFT在旋转不变性上的对比实验 这篇文章不讨论SIFT,GIFT的实现原理,只从最终匹配结果的准 ...

  10. 【Maven】在 Idea 中使用 Maven

    在 Idea 中使用 Maven 1 在 Idea 中配置 Maven Idea 中也自带 Maven 插件,而且我们也可以给自带的 Maven 插件进行配置,所以我们可以使用自带的 Maven,也可 ...