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. Linux下的Shell工作原理

    Linux下的Shell工作原理 Linux系统提供给用户的最重要的系统程序是Shell命令语言解释程序.它不属于内核部分,而是在核心之外,以用户态方式运行.其基本功能是解释并执行用户打入的各种命令, ...

  2. GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组

    1 drop table orders; 2 create table orders ( 3 o_id int auto_increment primary key, 4 orderdate date ...

  3. Acwing 883高斯消元法的运用

    Acwing 883高斯消元法的运用 解线性方程组 Acwing 883 输入一个包含 n 个方程 n 个未知数的线性方程组. 方程组中的系数为实数. 求解这个方程组. 下图为一个包含 m 个方程 n ...

  4. sparksql字段类型转换

    1.spark sql 计算时,一定要注意精度的问题,一般像金额之类的值,要先转换为double或者 decimal来进行计算了. 一.sql的方式:select shop_id,order_id,s ...

  5. 使用Hugo和GitHub搭建博客

    折腾了几天博客的框架终于搭建起来了.研究了一番之后,最终还是选择使用Hugo和GitHub来搭建博客.本文介绍了如何使用Hugo来搭建静态博客网站,并将其部署在GitHub上.使用https://&l ...

  6. Python如何读写Excel文件-使用xlrd/xlwt模块

    时间: 2020-08-18 整理: qiyuan 安装和导入 1.模块介绍 在 python 中使用 xlrd/xlwt 和 openpyxl 模块可以对Excel电子表格(xls.xlsx文件)进 ...

  7. sql函数大全

    sql函数大全 一.内部函数 1.内部合计函数 1)COUNT(*) 返回行数 2)COUNT(DISTINCT COLNAME) 返回指定列中唯一值的个数 3)SUM(COLNAME/EXPRESS ...

  8. linux 查看用户密码

    2021-07-26 1.查看前三个密码 head -3 / etc / passwd # 注解 /etc/passwd 中一行记录对应着一个用户,每行记录又被冒号 (:) 分隔为 7 个字段,其格式 ...

  9. MySQL数据完整性约束

    主键约束 主键可以是表中的某一列,也可以是表中的多个列所构成的一个组合:其中,由多个列组合而成的主键也称为复合主键.在MySQL中,主键列必须遵守以下规则. (1)每一个表只能定义一个主键. (2)唯 ...

  10. Mac automator bash 自动操作 右键菜单unrar解压 拷贝文件路径到剪贴板 快速删除(rm -rf) 快捷键设置

    https://tecadmin.net/pass-command-line-arguments-in-shell-script/ https://tecadmin.net/tutorial/bash ...