`

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中的 ${} 和 #{}区别与用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    mybatis 一对多多对多案例详解

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

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

    主要介绍了Mybatis中的 ${ } 和 #{ }的区别使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    mybatis和mybatis plus比较详解

    # 1. 前言 本文旨在探讨在SpringBoot框架下,...MyBatis在使用时需要开发者手动解析实体关系映射并转换为MyBatis内部对象注入容器,而MyBatis Plus则能够自动解析实体关系映射,并提供了内置的Mapper和通用的Service

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

    主要介绍了mybatis #{}和${}的区别、传参、基本语法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    Mybatis的详解以及使用

    这是Mybatis的详解以及使用,里面包括我写的一个小例子以及数据库表结构和数据的sql语句。详细介绍了mybatis的使用方法。

    MyBatis详解_与配置MyBatis

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

    MyBatis 工作原理和详解

    MyBatis是一个持久层框架,是apache下的顶级项目。 Mybatis托管到goolecode下,后来又托管到GitHub。 MyBatis让程序员主要精力都集中到sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员...

    Mybatis-Plus和Mybatis的区别详解

    主要介绍了Mybatis-Plus和Mybatis的区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    mybatis相关配置详解

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

    MyBatis的resultMap详解

    详细说明了MyBatis的resultMap使用方法

    mybatis-generator配置详解

    mybatis-generator配置详解:详细描述各XML标签的作用,便于快速上手使用。

    MyBatis源码详解学习.zip

    适合学习mybatis源码的各位同学,搜集不易,多多支持

    MyBatis+Geneator详解

    MyBatis+Geneator详解..

    MyBatis中resultMap和resultType的区别详解

    主要介绍了MyBatis中resultMap和resultType的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    mybatis 详解

    mybatis教学文档,加示例合集,是初学者所使用。是初学者所使用详解

    mybatis 实现 SQL 查询拦截修改详解

    主要介绍了mybatis 实现 SQL 查询拦截修改详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics