首页 > 其他分享 >Mybatis中的${}和#{}区别

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

时间:2023-11-08 18:33:59浏览次数:37  
标签:DBMS 区别 数据库 user sql Mybatis 解析 id

版权声明:本文为CSDN博主「普通网友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/web18484626332/article/details/126112943

前言

动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前, mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{}以及${}

提示:以下是本篇文章正文内容,下面案例可供参考

一、${}与#{}的区别

1、符号类型

(1)#{}:参数占位符,即预编译
(2)${} :字符串替换符,即SQL拼接

2、防注入问题

(1)#{}:很大程度上能防止sql 注入
(2)${}:不能防止sql 注入

3、参数替换位置
DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。它提供多种功能,可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。

(1)#{}:变量替换是在DBMS 中
(2)${}:变量替换是在 DBMS 外

4、参数解析
(1)#{}:将传入的数据都当成一个字符串,会对传入的变量自动加一个单引号。如:user_id = #{userId},如果传入的值是111,那么解析成sql时的值为user_id = ‘111’,如果传入的值是id,则解析成的sql为user_id = ‘id’。

(2)${}:将传入的参数直接显示生成在sql中,且不加任何引号。如:user_id = ${userId},如果传入的值是111,那么解析成sql时的值为user_id = 111 , 如果传入的值是id,则解析成的sql为user_id = id。

5、用$的情况
(1)MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName},这里MyBatis不会修改或转义字符串。

(2)${}方式一般用于传入数据库对象,例如传入表名

Select * from ${tableName} where user_id = #{userId}

6、sql执行过程
可参考“二”部分的案例
(1)#{}:编译好SQL后语句再去取值
(2)${}:取值以后再去编译SQL语句

7、一般能用#的就别用$
二、SQL解析
1、流程
(1)#{}:动态解析 -> 预编译 -> 执行
(2)${}:动态解析 -> 编译 -> 执行

标签:DBMS,区别,数据库,user,sql,Mybatis,解析,id
From: https://www.cnblogs.com/andy1234/p/17818063.html

相关文章

  • Mybatis集合映射
    Mybatis系列之集合映射上篇文章我们讲了关联映射,实现了销售与登录用户之间的关联。本文我们接着来讲一讲集合映射,实现销售与客户的多对多关系。实现销售与客户多对多关系Mybatis系列之关联映射》中的映射接口和测试用例,这里仅对增加和修改的内容进行讲解。第一步,在动手编写映射......
  • MyBatis的返回参数类型
    MyBatis的返回参数类型分两种1.对应的分类为:1.1.resultMap:1.2.resultType:2.对应返回值类型:2.1.resultMap:结果集2.2.resultType:int,string,long,class3.注意点:在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其......
  • Mybatis多表关联映射
    Mybatis多表关联映射查询结果集ResultMapresultMap元素是MyBatis中最重要最强大的元素。它就是让你远离90%的需要从结果集中取出数据的JDBC代码的那个东西,而且在一些情形下允许你做一些JDBC不支持的事情。事实上,编写相似于对复杂语句联合映射这些等同的代码,也许可以......
  • mybatis insert 返回主键
    需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值。方法1(推介使用):在mapper中指定keyProperty属性,示例如下:<insertid="insert"parameterType="com.cl.media.model.Advert" useGeneratedKeys="true"keyProperty=advertId"> insertintor_adv......
  • mybatis在xml文件中处理大于号小于号的方法
    第一种方法:用了转义字符把>和<替换掉,然后就没有问题了。SELECT*FROMtestWHERE1=1ANDstart_date <=CURRENT_DATEANDend_date>=CURRENT_DATE附:XML转义字符           <                     ......
  • 【U盘格式NTFS,FAT32,exFAT切换方法及各种文件系统区别】
    切换U盘格式步骤:1、格式化前,先确认把U盘离的数据进行备份,插入U盘,右击鼠标->点击格式化 2、进入格式化弹窗界面,选择所要修改的文件系统->点击开始->确定 各种文件系统区别:NTFS(NewTechnologyFileSystem意为新技术文件系统,其功能全面,应用最广泛。NTFS:1、NTFS这种格式的......
  • Java中的Runnable、Callable、Future、FutureTask的区别与示例
    Java中存在Runnable、Callable、Future、FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别。Runnable其中Runnable应该是我们最熟悉的接口,它只有一个run()函数,用于将耗时操作写在其中,该函数没有返回值。然......
  • Mybatis if test 判断数字时需要注意
    mybatis做if判断注意mybatis做if判断注意:下面这种写法只适用于id类型为字符串.<iftest="id!=nullandid!=''">id=#{id}</if>如果id类型为int当id=0时这个判断不会传该值的。test="id!=nullandid!=''orid==0">......
  • 开发者APP应用程序混合开发和原生开发的区别
    Hello,各位同学们好,我是咕噜铁蛋!随着移动应用市场的蓬勃发展,App开发成为越来越多开发者和企业的关注焦点。在App开发过程中,我们常常听到两种开发方式:原生开发和混合开发。今天铁蛋将和大家深入探讨这两种开发方式的区别,以帮助开发者更好地选择适合自己项目需求的开发方式。一、概念......
  • Java中用引号创建String对象和用构造函数的区别
    创建一个String对象一般有以下两种方式:Stringstr1="abcd";Stringstr2=newString("abcd");这两种方式有什么区别呢?我们可以通过下面两个小例子来说明.Example1:Stringa="abcd";Stringb="abcd";System.out.println(a==b);//True......