`

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

 
阅读更多

 

动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现

select * from user where name = #{name}; 

#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

select * from user where name = ?; 

 

 

那么我们使用 ${}的时候

select * from user where name = '${name}'; 

${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句

select * from user where name = "dato"; 

预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。

综上所得, ${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。

这是 #{} 和 ${} 我们能看到的主要的区别,除此之外,还有以下区别:

  • #方式能够很大程度防止sql注入。
  • $方式无法防止Sql注入。
  • $方式一般用于传入数据库对象,例如传入表名.
  • 一般能用#的就别用$.

所以我们在使用mybatis的时候,尽量的使用#方式!!!这是大家要注意的地方

分享到:
评论

相关推荐

    ibatis中 $ 于 # 的 区别

    在ibatis(现称为MyBatis)框架中,$ 和 # 是两种不同的动态SQL元素标记,用于处理参数传递的问题。它们各自有着独特的功能和应用场景,对于理解这两者的差异是十分重要的,因为这会直接影响到查询效率以及SQL注入等...

    Mybatis下动态sql中##和$$的区别讲解

    Mybatis下动态sql中##和$$的区别讲解 Mybatis是一款流行的ORM框架,能够帮助开发者快速构建数据库交互应用程序。在Mybatis中,动态SQL是一种强大特性,能够根据不同的输入参数生成不同的SQL语句。在Mybatis中,使用...

    Java Mybatis中的 ${ } 和 #{ }的区别使用详解

    Java Mybatis中的 ${ } 和 #{ } 的区别使用详解 Java Mybatis 中的 ${ } 和 #{ } 是两个不同的占位符,都是用于在 Mybatis 中进行动态 SQL 语句的构建和参数传递。然而,这两个占位符在使用时有着极其重要的区别。 ...

    MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

    在MyBatis框架中,${} 和 #{} 是两种不同的参数占位符,它们的使用方式和作用有明显的区别,对于SQL语句的安全性和效率有着重要影响。 1. #{} #{} 是预编译处理的方式,也被称为参数绑定或者预处理。在处理 #{ } ...

    Mybatis中#{}和${}传参的区别及#和$的区别小结

    在MyBatis框架中,`#{}`和`${}`是两种不同的参数占位符,它们在处理传参时有着显著的差异,同时也关联到`#`和`$`的区别。理解这些差异对于编写安全且高效的SQL查询至关重要。 首先,`#{}`是MyBatis的预编译参数占位...

    Mybatis现学现用

    很全很全:并且有项目实例 例如:mybatis中的#和$的区别? 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111",...

    MyBatis中使用$和#所遇到的问题及解决办法

    在MyBatis中,$和#的使用是动态SQL的关键部分,它们决定了参数如何被处理和插入到SQL语句中。下面将详细解释这两种符号的差异以及如何解决使用过程中遇到的问题。 1. #{}与${}的区别: - #{ }:这是MyBatis中的预...

    浅谈Mybatis #和$区别以及原理

    浅谈Mybatis #和$区别以及原理 Mybatis是一款流行的持久层框架,它提供了两个占位符:#和$,它们均用于参数化SQL语句,但是它们的作用和原理却有所不同,本文将详细介绍这两者的区别和原理。 #和$的区别 在...

    mybatis面试题#和$的区别.pdf

    mybatis面试题#和$的区别.pdf

    详解Mybatis中的 ${} 和 #{}区别与用法

    Mybatis中的 ${} 和 #{}区别与用法详解 Mybatis 是一个基于 Java 的持久层框架,它提供了一个简单的方式来进行数据库操作。在 Mybatis 中,使用 ${} 和 #{} 两种方式来传递参数,但它们之间有着很大的区别。 ${} ...

    浅谈mybatis中的#和$的区别

    在MyBatis中,`#`和`$`是用来动态构造SQL语句的占位符,它们的区别主要在于SQL预编译和防止SQL注入的能力。理解这两种符号的用法对于编写安全、高效的MyBatis映射文件至关重要。 1. `#`占位符: - `#`将传入的数据...

    关于MyBatis参数传入#{index}的问题的解决方案【源码】

    首先,让我们明确MyBatis中的#{index}与${index}的区别。#{index}是预编译的参数,它会将参数值转化为PreparedStatement的参数,有助于防止SQL注入。而${index}则是在SQL字符串中直接替换变量,不进行预编译,存在...

    Ibatis资料ibatai sql map iBATIS使用$和#的一些理解

    在使用iBATIS(现已被MyBatis取代)进行数据库操作时,我们常常需要传递参数到SQL语句中。在iBATIS中,有两种主要的方式来处理这些参数:使用`$`和`#`。这两种方式在不同的场景下有不同的效果。 首先,让我们来看看...

    myBatis和ibatis的区别

    通过对ibatis与myBatis之间区别的详细分析,我们可以看到myBatis不仅继承了ibatis的优点,还在很多方面进行了改进和优化,使得其在功能性和易用性上都有了显著提升。对于开发者而言,选择myBatis作为持久层框架可以...

    MyBatis 需要注意的地方junit注解

    5.mapper.xml中$和#取值的区别 4.mybatis的xml中如何设置返回值 resultType返回的数据类型 5.$和#区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值...

    mybatis和mybatis plus比较详解

    本文旨在深入探讨MyBatis与MyBatis Plus这两种流行持久层框架之间的区别、各自的优缺点及其适用场景。通过细致的对比分析,帮助开发者更好地理解这两种框架的特点,从而为自己的项目选择最适合的持久层解决方案。 #...

    浅谈mybatis中的#和$的区别 以及防止sql注入的方法

    在MyBatis中,`#`和`$`在动态SQL中的使用有着明显的区别,它们在处理传入数据的方式上有所不同,同时也与SQL注入的安全问题密切相关。了解这些区别对于编写安全且高效的MyBatis映射文件至关重要。 1. **# 的使用**...

    MyBatis中#号与美元符号的区别

    在MyBatis框架中,#号和美元符号($)在动态SQL中的使用有着显著的区别,这些差异直接影响到SQL语句的预编译、类型匹配以及安全性。 首先,#{}是MyBatis的预编译占位符。当使用#{变量名}时,MyBatis会进行预编译处理...

    IDEA的MyBatis插件两个

    在IT行业中,开发工具的选择和优化对于提升效率至关重要。IntelliJ IDEA,作为一款强大的Java集成开发环境(IDE),提供了丰富的插件支持,使得开发者能够更便捷地进行项目开发。本篇文章将详细介绍两个针对MyBatis...

    深入理解MyBatis中的一级缓存与二级缓存

    下面我们将深入了解MyBatis中的一级缓存和二级缓存。 一级缓存 一级缓存是SqlSession级别的缓存。它是在操作数据库时构造的SqlSession对象中维护的一个数据结构,用于存储缓存数据。不同的SqlSession之间的缓存...

Global site tag (gtag.js) - Google Analytics