`

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

 
阅读更多
先给大家介绍下MyBatis中#{}和${}的区别,具体介绍如下:

 

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".

 

2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.

 

3. #方式能够很大程度防止sql注入。 

 

4.$方式无法防止Sql注入。

 

5.$方式一般用于传入数据库对象,例如传入表名.

 

6.一般能用#的就别用$.

 

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

 

字符串替换

 

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

 

这里MyBatis不会修改或转义字符串。

 

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

 

mybatis本身的说明:

 

String Substitution

By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for ORDER BY, you might use something like this:

ORDER BY ${columnName}
Here MyBatis won't modify or escape the string.

NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or always perform your own escapes and checks.
 

从上文可以看出:

1. 使用#{}格式的语法在mybatis中使用Preparement语句来安全的设置值,执行sql类似下面的:

PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);

这样做的好处是:更安全,更迅速,通常也是首选做法。

2. 不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

此时MyBatis 不会修改或转义字符串。

这种方式类似于:

    Statement st = conn.createStatement();
       
      ResultSet rs = st.executeQuery(sql);

这种方式的缺点是: 以这种方式接受从用户输出的内容并提供给语句中不变的字符串是不安全的,会导致潜在的 SQL 注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验。

 

分享到:
评论

相关推荐

    Mybatis之#{}与${}的区别使用详解

    Mybatis之#{}与${}的区别使用详解 Mybatis是一款流行的持久层框架,它提供了两种方式来从数据库中获取数据,即#{}和${}。这两种方式都可以用来从数据库中获取数据,但是它们有着不同的使用场景和优缺点。 #{}的...

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

    Mybatis中#{}与${}的区别详解 Mybatis 中的 #{} 与 ${} 是两个不同的占位符号,用于实现动态 SQL,两者的主要区别在于防止 SQL 注入的能力。#{} 能够很大程度防止 SQL 注入,而 ${} 方式无法防止 SQL 注入。 #{} ...

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

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

    详解mybatis #{}和${}的区别、传参、基本语法

    MyBatis中#{}和${}的区别、传参、基本语法 MyBatis是一个基于Java的持久层框架,它提供了一个强大的SQL映射机制,能够将Java对象与数据库表之间建立映射关系。在MyBatis中,#{}和${}是两个非常重要的符号,它们用于...

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

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

    mybatis和mybatis plus比较详解

    ### MyBatis与MyBatis Plus的比较详解 #### 一、前言 在现代软件开发中,尤其是基于Java的企业级应用开发中,选择合适的持久层框架至关重要。本文旨在深入探讨MyBatis与MyBatis Plus这两种流行持久层框架之间的...

    mybatis 一对多多对多案例详解

    mybatis 一对多多对多案例详解 1、首先 准备sql 数据 user(用户表) role(角色表) 一个用户可以对用多个角色(老师,爸爸),一个角色可以被不同的用户所拥有 2、建立maven 工程 导入相关依赖 ,mybatis,mysql,junit,...

    MyBatis的resultMap详解

    MyBatis resultMap 详解 MyBatis 中的 resultMap 是一个非常重要的概念,它负责将查询...MyBatis 的 resultMap 是一个非常强大的工具,它可以帮助我们将查询结果映射到 Java 对象中,使得我们的开发更加方便和高效。

    MyBatis3中文官方文档

    根据提供的文件信息,我们可以从"MyBatis3中文官方文档"中提炼出以下关键知识点: ### 一、MyBatis概述 #### 1.1 什么是MyBatis? - **定义**:MyBatis是一个优秀的持久层框架,它支持普通的SQL查询、存储过程以及...

    MyBatis源码详解学习.zip

    Mapper接口和Mapper XML文件是MyBatis中的另一重要组成部分。Mapper接口定义了数据库操作的方法,而Mapper XML文件则包含了对应的SQL语句和结果映射。通过MapperProxy和MapperRegistry,MyBatis实现了接口方法调用到...

    Mybatis的详解以及使用

    Mybatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。Mybatis 避免了几乎所有的 JDBC 代码和手动...通过学习和实践这个例子,您可以掌握 Mybatis 的基本用法,并将其应用到实际的项目开发中。

    MyBatis 工作原理和详解

    MyBatis是一个强大的持久层框架,它专注于SQL的编写与管理,从而解放了开发者在处理数据库操作时的繁琐工作。作为一个Apache的顶级项目,MyBatis最初...它的强大功能和易用性使其成为Java开发中持久层框架的首选之一。

    MyBatis详解_与配置MyBatis

    MyBatis 详解与配置 MyBatis MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的 JDBC 代码、手工设置参数和结果集重获。MyBatis 只使用简单的 XML 和注解来配置和映射基本...

    Mybatis源码分析.pdf

    在处理请求的过程中,MyBatis内部使用了Executor、StatementHandler、ParameterHandler、ResultHandler和TypeHandler等组件。Executor作为执行器,负责SQL的执行和缓存管理;StatementHandler封装了JDBC Statement...

    mybatis-3.2.0说明文档

    根据给定的文件信息,以下是对mybatis-3.2.0说明文档中涉及的关键知识点的详细解析: ### 一、MyBatis简介 #### 1.1 MyBatis是什么? MyBatis是一个一流的持久层框架,支持自定义SQL、存储过程以及高级映射功能。...

    mybatis-generator配置详解

    Mybatis-generator是Mybatis官方提供的一个用于自动生成Mybatis的Mapper、Model、XML的代码生成工具。...同时,了解并掌握Mybatis-generator的配置文件中各个标签的作用,可以帮助开发者更好地理解和使用该工具。

    Mybatis Generator最完整配置详解

    在使用Mybatis Generator自动生成代码的过程中,正确配置`generatorConfig.xml`文件对于确保生成代码的质量和适用性至关重要。本文将详细解析`generatorConfig.xml`中的各项配置参数及其作用,帮助开发者更好地理解...

    mybatis相关配置详解

    如果你不会配置mybatis中的相关xml配置,就进来看看,手把手教学,可以从零开始

Global site tag (gtag.js) - Google Analytics