MyBatis 中 #{} 和 ${} 的区别

1、在MyBatis 的映射配置文件中,动态传递参数有两种方式:

(1)#{} 占位符

(2)${} 拼接符

2、#{} 和 ${} 的区别

(1)

1)#{} 为参数占位符 ?,即sql 预编译

2)${} 为字符串替换,即 sql 拼接

(2)

1)#{}:动态解析 -> 预编译 -> 执行

2)${}:动态解析 -> 编译 -> 执行

(3)

1)#{} 的变量替换是在DBMS 中

2)${} 的变量替换是在 DBMS 外

(4)

1)变量替换后,#{} 对应的变量自动加上单引号 ''

2)变量替换后,${} 对应的变量不会加上单引号 ''

(5)

1)#{} 能防止sql 注入

2)${} 不能防止sql 注入

3、#{} 和 ${} 的实例:假设传入参数为 1

(1)开始

1)#{}:select * from t_user where uid=#{uid}

2)${}:select * from t_user where uid= '${uid}'

(2)然后

1)#{}:select * from t_user where uid= ?

2)${}:select * from t_user where uid= '1'

(3)最后

1)#{}:select * from t_user where uid= '1'

2)${}:select * from t_user where uid= '1'

4、#{} 和 ${} 的大括号中的值

(1)单个参数的情形

1)#{}

无MyBatis 默认值,可任意,且与参数名无关

2)${}

<1>使用 MyBatis 默认值 value,即 ${value}

<2>使用自定义参数名,前提:在映射器接口方法的参数前加注解@Param("")

(2)多个参数的情形

1)#{}

<1>使用MyBatis 默认值 arg0、arg1、arg2 … 或 param1、param2、param3 …

<2>使用自定义参数名,前提:在映射器接口方法的参数前加注解@Param("")

2)${}

<1>使用MyBatis 默认值 arg0、arg1、arg2 … 或 param1、param2、param3 …

<2>使用自定义参数名,前提:在映射器接口方法的参数前加注解@Param("")

注:@Param("") 是 @Param(value="") 的简写

5、#{} 和 ${} 在使用中的技巧和建议

(1)不论是单个参数,还是多个参数,一律都建议使用注解@Param("")

(2)能用 #{} 的地方就用 #{},不用或少用 ${}

(3)表名作参数时,必须用 ${}。如:select * from ${tableName}

(4)order by 时,必须用 ${}。如:select * from t_user order by ${columnName}

(5)使用 ${} 时,要注意何时加或不加单引号,即 ${} 和 '${}'【注意:由于$()不加引号,所以用在字段上时需要自己额外再加上一个引号】

【#{}和${}的作用其他区别参照statement和preparestatement的编译和预编译的区别】
————————————————
版权声明:本文为CSDN博主「siwuxie095」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/siwuxie095/article/details/79190856

mybatis中的#和$的使用规范的更多相关文章

  1. mybatis 05: mybatis中的动态代理

    mybatis中动态代理存在的意义 图示 图示分析 分层说明:界面层为第一层,业务逻辑层(接口层 + 实现层)为第二层,数据访问层(接口层 + 实现层)为第三层 业务逻辑层和数据访问层:分别分两层来开 ...

  2. 【mybatis深度历险系列】深入浅出mybatis中原始dao的开发和mapper代理开发

    使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder ...

  3. MyBatis中Mapper的返回值类型

    insert.update.delete语句的返回值类型 对数据库执行修改操作时,数据库会返回受影响的行数. 在MyBatis(使用版本3.4.6,早期版本不支持)中insert.update.del ...

  4. 学习Spring Boot:(十二)Mybatis 中自定义枚举转换器

    前言 在 Spring Boot 中使用 Mybatis 中遇到了字段为枚举类型,数据库存储的是枚举的值,发现它不能自动装载. 解决 内置枚举转换器 MyBatis内置了两个枚举转换器分别是:org. ...

  5. Mybatis中的连接池

    Mybatis中DataSource的存取 MyBatis是通过工厂模式来创建数据源DataSource对象的,MyBatis定义了抽象的工厂接口:org.apache.ibatis.datasour ...

  6. mybatis中xml字段空判断及模糊查询

    由于业务特殊的查询需求,需要下面的这种查询,一直感觉模糊不清,本地测试一下顺便做个总结 贴一段xml代码,如下: <if test="receivedName != null and ...

  7. ResultMap和ResultType在使用中的区别、MyBatis中Mapper的返回值类型

    在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 resultType:当使 ...

  8. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  9. 记录一次bug解决过程:mybatis中$和#的使用

    一.总结 mybatis中使用sqlMap进行sql查询时,经常需要动态传递参数.动态SQL是mybatis的强大特性之一,也是它优于其他ORM框架的一个重要原因.mybatis在对sql语句进行预编 ...

随机推荐

  1. Linux 中安装、升级、配置 Swoole 扩展

    从源码编译安装 # 下载Swoole wget http://pecl.php.net/get/swoole-4.5.2.tgz tar -zxvf swoole-4.5.2.tgz cd swool ...

  2. Python中单下划线与双下划线用法总结

    看mentor的脚本时,遇到self._item.callspec.getparam('')语句,理解起来比较困难,找到一篇文章,记录的比较详细,特别记录一下,以备复习. 附链接地址:http://w ...

  3. centos7 RPM命令使用

    rpm -qa 软件名称 ---查看软件是否安装成功 rpm -ql  软件名称 ---查看软件中都有什么 rpm -qf  文件名称(绝对路径) ---查看属于哪个软件 rpm -ivh 包     ...

  4. 第10组 Beta冲刺 (4/5)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客: https://www.cnblogs.com/cpandbb/p/14018650.html ·作业博客:https://edu.cnblogs.c ...

  5. webpack 多环境打包

    目前来说有两种方案: 方案一: 1.修改build文件夹下build.js文件 添加声明变量 2.修改config文件夹下dev.env.js文件 这个是开发环境所用版本 3.修改config文件夹下 ...

  6. 使用Swing的GUI编程

    Swing AWT概述 AWT:抽象窗口工具包,提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具 Swing以AWT为基础的,尽管Swing消除了 ...

  7. day 9 scanf输入和gets输入的区别

    (1).计算机高级语言程序运行方法有编译执行和编译解释两种,一下叙述中正确的是[A] A.C语言程序仅可以编译执行 B.C语言程序仅可以解释执行 C.C语言程序既可以编译执行又可以解释执行 D.以上说 ...

  8. 02-JS中的数据类型及类型转换

    02-JS中的数据类型及类型转换 一.数据类型 JS中的值,无论是字面量还是变量,都有明确的类型. (一)概述 1.基本类型5种 number 数字类型 string 字符串类型 boolean 布尔 ...

  9. gin中multipart/urlencoded表单

    package main import ( "github.com/gin-gonic/gin" ) func main() { router := gin.Default() r ...

  10. Qt中编译器

    很多时候,Qt构建项目编译的过程中会报错,大部分报错是因为qt的设置出现问题,很多时候环境配置时要选择合适的编译器,debugger调试器等,这里对一些名词解释,内容对新手很友好,大佬就不用看啦. M ...