面试题:Mybatis中的#{}和${}有什么区别?这是我见过最好的回答
面试题:Mybatis中的#{}和${}有什么区别?
前言
今天来分享一道比较好的面试题,“Mybatis中的#{}和${}有什么区别?”。
对于这个问题,我们一起看看考察点和比较好的回答吧!题,看看普通人
考察点
mybatis是现在企业级开发中经常使用的数据持久层框架,这个问题就是面试官想考察我们对#{},${}有没有深刻的认识,以及日常开发中是否善于积累,认真思考。
回答
下面我从3个点来回答:
1.共同点:#,$都是去实现动态SQL的一种方式,通过这种方式我们可以把参数传递到xml中,在执行前mybatis会对占位符进行动态解析。
2.# 等同于jdbc里面的 ?占位符,相当于向PreparedStatement(了解PreparedStateMent https://jenkov.com/tutorials/jdbc/preparedstatement.html)中设置属性值,而我们的PreparedStatement是预编译的,它规定了SQL语句的一个结构,并且在设置参数的时候,如果有特殊的字符会自动进行转义,所以#占位符可以防止SQL注入。
String sql = "update people set firstname=? , lastname=? where id=?";
PreparedStatement preparedStatement =connection.prepareStatement(sql);
preparedStatement.setString(1, "Gary");
preparedStatement.setString(2, "Larson");
preparedStatement.setLong (3, 123);
int rowsAffected = preparedStatement.executeUpdate();
3.$ 的方式相当于直接把参数拼接到SQL中,Mybatis不会对它进行任何特殊的处理。所以不能够防止SQL注入。但是$占位符更多的是动态参数,#其实是用来做占位符的。$更适合动态传递表名,动态设置排序字段等。
以上就是我对于这个问题的理解。
总结
这个问题主要是考察求职者对mybatis中常见占位符的理解能力。在实际应用中,mybatis是最常用的功能,对于这部分内容如果理解不够深刻,很容易造成事务不生效的问题。希望读完这篇文章你有所收获。欢迎转发,关注微信公众号:程序员的故事,了解更多精彩面试题。

精选推荐
面试题:Mybatis中的#{}和${}有什么区别?这是我见过最好的回答的更多相关文章
- (后端)Mybatis中#{}和${}传参的区别及#和$的区别小结(转)
原文地址:https://www.cnblogs.com/zqr99/p/8094234.html 最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, ...
- Mybatis中#{}和${}传参的区别及#和$的区别小结
最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"&quo ...
- 在mybatis中resultMap与resultType的区别
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMapresultType是直接表示返回类型的,而resultMap则是对外部ResultMa ...
- Mybatis中#{}和${}传参的区别
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111&qu ...
- MyBatis中resultType和resultMap的区别
resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义.因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名 ...
- Mybatis中$和#取数据的区别
Mybatis配置中,取出map入参的数据一般有两种方式#{key}和${key},下面是这两种取值的区别: 以同样的语句做对比: <select id="geUserByParam1 ...
- MyBatis中的#和$有什么区别
什么是MyBatis MyBatis是一款优秀的持久层框架,特别是在国内(国外据说还是 Hibernate 的天下)非常的流行,我们常说的SSM组合中的M指的就是#mybatis#. MyBatis支 ...
- 记录下mybatis中#{}和${}传参的区别
最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"&quo ...
- mybatis 中javaType和OfType 的区别
JavaType和ofType都是用来指定对象类型的,但是JavaType是用来指定pojo中属性的类型,而ofType指定的是映射到list集合属性中pojo的类型.pojo类: publiccla ...
- mybatis中查询使用#{}和${}的区别
${}中的变量什么值,就会简单的替代变量,不会做处理 比如delete * from tb_label where name=${labelname} 如果labelname的值是 something ...
随机推荐
- 在C++中,传值还是传引用?
情况一:需要修改原对象 需要修改原对象的情况,必须要传引用.这种情况没什么要说的. 情况二:不需要修改原对象 对于内置类型(整数.浮点数.字符类型等),传值效率更高.主要有三点原因: 内存开销更小.由 ...
- Doris(五) -- 数据的导入导出
数据导入 使用 Insert 方式同步数据 用户可以通过 MySQL 协议,使用 INSERT 语句进行数据导入 INSERT 语句的使用方式和 MySQL 等数据库中 INSERT 语句的使用方式类 ...
- 通过redis学网络(1)-用go基于epoll实现最简单网络通信框架
本系列主要是为了对redis的网络模型进行学习,我会用golang实现一个reactor网络模型,并实现对redis协议的解析. 系列源码已经上传github https://github.com/H ...
- P3498 [POI2010]KOR-Beads 题解
前言: 最近在做哈希的题,发现了这道好题,看题解里很多大佬的方法都很巧妙,自己就发一个较为朴素的方法吧. 题意: 题目传送门 给你一个序列,需要求出数 k,使划分的子串长度为 k 时,不同的子串数量最 ...
- P1585 魔法阵 题解
题意: 题目传送门 可以看做一个人手中有一些宝石,并将宝石分成两组,一组的编号为 1 至 n×m/2,二组为 n×m/2+1 至 n×m+1.当两组两个宝石编号相差为 n×m/2 为一对.现在要遍历一 ...
- 全同态(Fully Homomorphic Encryption, FHE)和半同态(Partially Homomorphic Encryption, PHE)介绍
全同态(Fully Homomorphic Encryption, FHE)和半同态(Partially Homomorphic Encryption, PHE) 全同态加密(FHE)是指一种加密方案 ...
- 一篇随笔学会CSS
CSS3 1.CSS介绍 HTML+CSS+JS 结构+表现+交互 2.CSS发展史 Cascading Style Sheet 层叠级联样式表 表现层:美化网页(字体.颜色.边距.宽高.网页定位.网 ...
- sFlow-RT监控设备教程
1.前言 sflow-rt网站国内无法访问,这里使用蓝奏云下载 2.下载源码 https://lvpeiming.lanzoup.com/imRxy10was0h密码:5rxk 3.开启sFlow-R ...
- CH32V003使用ADC八通道转换注意事项
本文以CH32V003_F4P6(20Pin)为模板 1.PA1.PA2为外部晶振输入引脚,同时也是ADC的CH1与CH0,所以需要先在system_ch32v00x.c文件中更改为内部48M的宏即可 ...
- 【Docker】部署Redis
1.下载镜像 #下载最新版Redis镜像 (其实此命令就等同于 : docker pull redis:latest ) docker pull redis # 下载指定版本的Redis镜像 (xxx ...