1. 首先对于一个接口

    Employee getEmpByIdAndName(@Param("id") Integer id,@Param("empName") String empName);

2. 然后是他的sql语句

    <select id="getEmpByIdAndName" resultType="com.xj.bean.Employee">
select \* from t_employee where id=#{id} and empname=#{empName}
</select>

3. 我们可以观察到控制台的日志

DEBUG 09-08 19:49:57,254 ==> Preparing: select * from t_employee where id=? and empname=? (BaseJdbcLogger.java:159)

DEBUG 09-08 19:49:57,298 ==> Parameters: 1(Integer), zxj(String) (BaseJdbcLogger.java:159)

DEBUG 09-08 19:49:57,396 <== Total: 0 (BaseJdbcLogger.java:159)

4. 如果将sql语句中的#{id}修改为${id}

  • 注意此处的where id=${id}
    <select id="getEmpByIdAndName" resultType="com.xj.bean.Employee">
select \* from t_employee where id=${id} and empname=#{empName}
</select>

5. 我们再来观察日志

DEBUG 09-08 19:51:49,080 ==> Preparing: select * from t_employee where id=1 and empname=? (BaseJdbcLogger.java:159)

DEBUG 09-08 19:51:49,106 ==> Parameters: zxj(String) (BaseJdbcLogger.java:159)

DEBUG 09-08 19:51:49,123 <== Total: 0 (BaseJdbcLogger.java:159)

6. 我们可以看到where处,id由原来的=?,修改为=1。

结论:

  • #{}:参数预编译,参数的位置都是由?替代,之后再设置进去,防止sql注入
  • ${}:不是参数预编译,而是直接与sql语句拼串,不安全

tips:对于sql来说,只有参数位置支持预编译,而如果想查询不同的表,就需要使用到${}

比如:对于日志文件,会进行分表操作,log_2020,log_2019,如果想要查询不同表的信息,就需要用到${}

不行:select * from #{tableName}

行:select * from ${tableName}

mybatis中#{}与${}取值的区别的更多相关文章

  1. Mybatis中$和#取数据的区别

    Mybatis配置中,取出map入参的数据一般有两种方式#{key}和${key},下面是这两种取值的区别: 以同样的语句做对比: <select id="geUserByParam1 ...

  2. 浅析mybatis中${}和#{}取值区别

    mybatis作为一个轻量级的ORM框架,应用广泛,其上手使用也比较简单:一个成熟的框架,必然有精巧的设计,值得学习. 在使用mybatis框架时,在sql语句中获取传入的参数有如下两种方式: ${p ...

  3. mybatis中 ${}和#取值小记(Parameter index out of range)

    mybatis mapperxml文件中有两种取值法.${}和#{} $的是原样,#的是取值并转成指定?#{ele1,jdbcType=VARCHAR} 有个坑, 错误的写法 <if test= ...

  4. UI:字典的两种取值的区别

    字典的两种取值的区别 (objectForKey: 和 valueForKey )参考 一般来说 key 可以是任意字符串组合,如果 key 不是以 @ 符号开头,这时候 valueForKey: 等 ...

  5. Loadrunner中参数化取值方式分析

    Loadrunner中参数化取值依赖两个维度: 1.取值顺序分为“顺序”“随机”“唯一”.    select next row:Sequential , Random,unique 2.更新值时分为 ...

  6. Laravel 中 Session 的使用问题(dd()导致laravel中session取值问题)

    Laravel 中 Session 的使用问题(dd()导致laravel中session取值问题) 一.总结 一句话总结: Laravel 会首先收集需要写入 Session 的所有数据,并在用户的 ...

  7. mybatis映射文件参数处理 #{}取值与${}取值的区别

    #{}:是以预编译的映射,将参数设置到sql语句中,和jdbc的preraredStatement一样,使用占位符,防止sql注入. ${}:取出的值会直接拼装在sql中,会有安全问题. 大多数情况下 ...

  8. jquery data方法取值与js attr取值的区别

    <a data-v="3"></a> jquery data方法的运行机制: 第一次查找dom,使用attributes获取到dom节点值,并将其值存到缓存 ...

  9. (后端)Mybatis中#{}和${}传参的区别及#和$的区别小结(转)

    原文地址:https://www.cnblogs.com/zqr99/p/8094234.html 最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, ...

随机推荐

  1. 使用VSCode创建第一个VUE项目

    vue init webpack vue_test回车,然后输入工程名称vue_test vue:Missing space before value for key 'components' 原因是 ...

  2. Jemeter压力测试

    Jmeter教程 简单的压力测试 Jmeter是一个非常好用的压力测试工具.  Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好. 转载自小坦克:https: ...

  3. py2neo学习记录

    py2neo 通用 # -*- coding: UTF-8 -*- from py2neo import Graph, Node, Relationship, walk, NodeMatcher, R ...

  4. 【Google Cloud技术咨询】「Contact Center AI」引领我们走向高度智能客服的时代

    前提背景 我们距离"不再智障"的智能客服还有多远?对于智能客服,用户一直都是"批评多于褒奖",究其原因是在于人们对于AI客服的期待很高,而AI客服在实际应用中的 ...

  5. 使用Visual Studio分析dump

    最近系统是不是CPU会飙升的百分之九十多甚至百分百,在本地又很难复现问题,无法定位问题出现在哪. 可以用转储文件来保存现场,然后通过分析dump文件可以大概分析出问题的所在 生成转存文件 在CPU飙升 ...

  6. Go版本依赖--版本选择机制

    目录 1. 版本选择机制 2.依赖包版本约定 2.1 Go module 之前版本兼容性 2.2 Go module 之后版本兼容性 3. 版本选择机制 3.1 最新版本选择 3.2 最小版本选择 1 ...

  7. mybatis第一个程序随笔

    今天继续学习了解如何写一个mybatis程序 创建了Dao层 1.1 创建一个UserDao接口 1.2 创建UserMapper.xml文件 在mybaits中文手册查找配置信息 <?xml ...

  8. APMserv 5.2.6 安装教程

    1.下载APMServ5.2.6.rar压缩包后解压,得到文件APMServ5.1.2.exe,其余两个没什么大用,APMServ解压缩说明.txt可以看一下,里面详细介绍了APMServ的功能和注意 ...

  9. SpringBoot-初见

    目录 简单介绍 什么是SpingBoot? 微服务 单体应用架构 微服务架构 怎么构建微服务 第一个SpringBoot程序 官方网站快速构建 IDEA 代码 自动装配(要点) pom.xml 启动器 ...

  10. JS获取DOM元素的八种方法

    JS获取DOM元素的方法(8种) 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名 ...