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. C#基础知识---扩展方法

    一.简介 扩展方法为现有的类型(.Net类型或者自定义类型)扩展应该附加到该类型中的方法. 二.基本原则 定义一个非嵌套.非泛型的静态类 扩展方法是静态的 扩展方法至少要有一个参数,该参数类型是要扩展 ...

  2. WPF日积月累之文件监测与DataGrid指定Row的颜色

    一.概述 关于DataGrid指定Row的颜色,我们可以使用转换器和DataGridRow的Style来实现.对于文件的检测,我们可以使用FileSystemWatcher来实现. 二.Demo Co ...

  3. MySQL常用权限操作

    MySQL常用权限操作 ** ubuntu mysql 8.0.21修改root密码 ** 1.查看默认安装密码: sudo cat /etc/mysql/debian.cnf 2. 登录mysql ...

  4. 测试工具Wiremock介绍

    WireMock是一个开源的测试工具,支持HTTP响应存根.请求验证.代理/拦截.记录和回放.最直接的用法: 为Web/移动应用构建Mock Service 快速创建Web API原型 模拟Web S ...

  5. JDBC中的元数据——1.数据库元数据

    package metadata; import java.sql.Connection; import java.sql.DatabaseMetaData; import javax.sql.Dat ...

  6. webpack编译后的代码如何在浏览器执行

    浏览器是无法直接使用模块之间的commonjs或es6,webpack在打包时做了什么处理,才能让浏览器能够执行呢,往下看吧. 使用commonjs语法 先看下写的代码, app.js minus.j ...

  7. springboot全局异常封装案例

    @ControllerAdvice三个场景:>https://www.cnblogs.com/lenve/p/10748453.html 全局异常处理 全局数据绑定 全局数据预处理 首先定义一个 ...

  8. python常用工具库介绍

    Numpy:科学计算 HOME:  http://www.numpy.org/ NumPy is the fundamental package for scientific computing wi ...

  9. 一个基于activiti审批流程示例,如何与系统整合

    前言 目前市场上有很多开源平台没有整合工作流,即使有,也是价格不菲的商业版,来看这篇文章的估计也了解了行情,肯定不便宜.我这个快速开发平台在系统基础功能(用户管理,部门管理-)上整合了工作流,你可以直 ...

  10. Kickstart无人值守原理及简介

    原文转自:https://www.cnblogs.com/itzgr/p/10029461.html作者:木二 目录 一 简介及原理 二 搭建无人值守步骤 三 PXE介绍 四 Kickstart简介 ...