Mybatis 中$与#的区别

1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id ='1'.

2 $是将传入的数据直接显示生成sql语句,eg:select id,name,age from student where id =${id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id = 1.

3 使用#可以很大程度上防止sql注入。(语句的拼接)

4 但是如果使用在order by 中就需要使用 $.

5 在大多数情况下还是经常使用#,但在不同情况下必须使用$.

我觉得#与的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,而的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,而{}穿入值,sql解析时,参数是不带引号的。

一 : 理解mybatis中 $与#

在mybatis中的$与#都是在sql中动态的传入参数。

eg:select id,name,age from student where name=#{name}  这个name是动态的,可变的。当你传入什么样的值,就会根据你传入的值执行sql语句。

二:使用$与#

#{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。

${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。

name-->cy

eg:  select id,name,age from student where name=#{name}   -- name='cy'

select id,name,age from student where name=${name}    -- name=cy

Mybatis @param使用场景

请参考如下博客

https://blog.csdn.net/u012702547/article/details/96963374

总结:

1. Mybatis在解析mapper.xml文件时,针对通过#{}引用的参数,是通过?占位符和PreparedStatement.setObject()方式来组装sql语句的,可以方式sql注入。比如传入的参数 username="xyz", password="nihao' or '1'='1"下边的方式可以可以防止sql注入。

String sql = "delete from user where username = ? and password = ?";PreparedStatement pstmt = con.prepareStatement(sql);//添加参数pstmt.setString(1, username);pstmt.setString(2, password);//进行查询rs = pstmt.executeQuery();

而通过${}引用的参数,是直接通过字符串拼装的方式构造最终执行的sql语句。就像下边这样:

stmt =con.createStatement();String sql = "delete from garytb where username = '"+username+"' and password = '"+password+"'";rs = stmt.executeQuery(sql);

2. #{}如果是字符串类型,会自动加上引号。而${}不会,mybatis底层只是会做一个字面量的拼接。

    //username="xyz"<select id="test" >SELECT * FROM USERS WHERE USERNAME = #{userName};</select>

比如上边的mapper.xml文件中定义的语句,最后拼装的结果是

SELECT * FROM USERS WHERE USERNAME ='xmy';

而如果上边的参数替换成${userName},则效果就变成了:

SELECT * FROM USERS WHERE USERNAME =xmy;

执行的时候就会报错。

3. 有的时候参数是表明或列明时,拼接后的字符串表明和列明肯定不能有引号,这时${}就派上用场了。需要注意的是,使用${}时,定义mapper接口时,需要在参数名字前使用@param。

@Mapper
public interface UserMapper {List<User> getAllUsers(@Param("order_by")String order_by);
}<select id="getAllUsers" resultType="xxx.User">select * from user order by ${order_by} desc
</select>

再比如,我们希望使用select  in()语句,这个时候也是只能使用${}。

@Mapper
public interface UserMapper {List<User> getAllUsers(@Param("order_by")String userNames);
}//userNames="'Bob','Tom','Jerry'";
<select id="getAllUsers" resultType="xxx.User">select * from user where userName in(${userNames})
</select>

Mybatis #和$获取参数值的区别以及@param的使用场景相关推荐

  1. SSM整合之Mybatis笔记( MyBatis获取参数值的两种方式(重要))(P020—P025)

    P20 MyBatis获取参数值的两种方式(重要) 一.什么叫做获取取参数值的两种方式 以后在我们开发是方向B/S系统,然后我们现在要做的任务通过浏览器/页面/视图 收集用户输入的一些数据,然后把这些 ...

  2. Mybatis获取参数值的方式

    一. Mybatis获取参数值的各种情况 1.mapper接口方法的参数为单个字面量的类型 2.mapper接口方法的参数有多个 3.手动把参数放在map集合中 4.mapper接口方法的参数是实体类 ...

  3. MyBatis获取参数值的两种方式以及传参情况

    MyBatis获取参数值的两种方式 MyBatis获取参数值的两种方式:${}和#{} 传参情况 演示环境 1.单个字面量类型的参数 2.多个字面量类型的参数 3.map集合类型的参数 4.实体类类型 ...

  4. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  5. jdbc,mybatis,hibernate各自优缺点及区别

    jdbc,mybatis,hibernate各自优缺点及区别 先比较下jdbc编程和hibernate编程各自的优缺点. JDBC: 我们平时使用jdbc进行编程,大致需要下面几个步骤:1,使用jdb ...

  6. iBatis 2.x 和 MyBatis 3.0.x 的区别

    简介: 本文主要讲述了 iBatis 2.x 和 MyBatis 3.0.x 的区别,以及从 iBatis 向 MyBatis 移植时需要注意的地方.通过对本文的学习,读者基本能够了解 MyBatis ...

  7. java in查询无法查询到数据(mybatis字符#与字符$的区别)

    mybatis字符#与字符$的区别 问题:使用in查询查询出一批数据,in查询的参数是字符串拼接的.调试过程中,把mybatis输出的sql复制到navicat中,在控制台将sql的参数也复制出来,替 ...

  8. 【mybatis】mybatis中 的# 和 $的区别

    mybatis中 的# 和 $的区别 参考地址:https://www.cnblogs.com/sxdcgaq8080/p/10869144.html 转载于:https://www.cnblogs. ...

  9. mybatis映射器${}和#{}的区别

    mybatis映射器${}和#{}的区别 转载于:https://www.cnblogs.com/liyuchen/p/7850185.html

最新文章

  1. Android多个imei如何获取,如何在Android 10中获取IMEI号,这是获取在Android 10及以下Android 10中获取IMEI号的代码...
  2. python长整型字节数_Python将整数转换为16字节字节
  3. vue根据不同权限显示图片_vue多级权限组件的实现
  4. oracle数据库物理结构包含,Oracle - 数据库物理结构
  5. 【PHP】网站防止QQ拦截防红跳转代码
  6. Codeforces Beta Round #8 C. Looking for Order 状压dp
  7. java连接Oracle数据库
  8. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·007【uni-app和vue.js基础快速上手】
  9. labelme批量json_to_dataset转换
  10. 多目标跟踪-Multi-Object Tracking
  11. 初识Hadoop入门介绍
  12. iOS图形学(四):iOS中的绘图框架
  13. 购入计算机主机怎么入账,出纳记账软件更换主机电脑时如何备份附件资料?
  14. 捷联惯导算法与组合导航原理讲义捷联惯导基础知识剖析目录
  15. java打印堆栈信息_Java 打印堆栈的几种方法
  16. QTP网管自动化测试框架
  17. PHP除数取余数,php相除取余数的实现方法
  18. SQL语句--简单的函数书写举例(3)
  19. 2022云和恩墨大讲堂·苏州站成功举办,论道数智化时代下国产数据库的技术创新与实践
  20. 如何用帮助中心自助服务页面提高客户使用体验

热门文章

  1. 工业机器人上半年产业分析
  2. 线上会议直播平台有哪些
  3. 4款宝藏国产软件,装了就舍不得卸载,白嫖必备
  4. 文件上传——后台上传文件并进行后缀名和大小限制
  5. 网络笔记_OSPF不同网络类型通讯、虚连接的应用
  6. python实现图片格式转换_干货必看 | Python实现图片格式转化
  7. EL表达式与JSTL简单入门
  8. HD ACM 切蛋糕
  9. RPC接口测试技术-Tcp 协议的接口测试
  10. 信息系统监理师【1】--岗位和测试