`

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

 
阅读更多

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

    总结--Mybatis传递参数的几种方法

    Mybatis 中传递参数有多种方法,以下是其中的四种: 1. 传递单个参数 在 Mybatis 中,传递单个参数非常简单。可以直接将参数写在方法中,参数类型可以是 String,也可以是基本类型,都可以自动识别。例如: ```...

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

    MyBatis传参方式 MyBatis提供了多种传参方式,包括非注解和注解两种。 非注解传参 1. 单参数: public User getUserByUuid(String uuid); SELECT * FROM t_user WHERE uuid = #{uuid} 2. 多参数: public ...

    Mybatis框架 mapper.xml文件中parameterType传递参数常用的几种方式.pdf

    以下是几种常用的parameterType参数传递方式以及#和$在Mybatis中传参的区别。 1. 使用依次顺序传参: 在这种方式中,参数按照顺序传递,SQL语句中使用#{参数索引}来引用参数。例如,有一个查询用户的方法,用户名...

    mybatis Mapper.xml中传参多选 字符串形式逗号分隔 AND中拼接OR.rar

    在实际开发中,你还需要在对应的Java接口和实现类中编写对应的方法,将前端传递的参数正确地绑定到Map对象中,并调用Mybatis的SqlSession执行查询。 总的来说,Mybatis提供了一套灵活的机制来处理动态SQL,包括处理...

    Mybatis动态传参、日志记录、二级缓存.docx

    Mybatis 是一个基于 Java 的持久层框架,它提供了动态传参、二级缓存和日志记录等功能。本文将对 Mybatis 的动态传参、日志记录和二级缓存进行详细介绍。 一、Mybatis 动态传参 Mybatis 提供了多种方式来实现动态...

    springboot整合mybatis案例(xml方式)

    MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 3. **SpringBoot整合MyBatis的基本步骤** - **添加依赖**:在`pom.xml`...

    mybatis笔记

    MyBatis 可以使用简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。 #### 二、POJO 和 JavaBean 的区别 - **POJO (Plain Old Java...

    mybatis笔记.zip

    9. **参数类型处理**:MyBatis支持简单参数、Map参数、注解参数和自定义参数对象,提供了多种传参方式。 10. **缓存机制**:MyBatis内置了本地缓存和二级缓存,可以提高数据访问效率,减少对数据库的访问。 这些...

    MyBatis拦截器分页与动态修改SQL及其参数值

    在这个主题中,我们将深入探讨如何利用MyBatis拦截器实现分页以及动态地修改SQL语句和参数值。 首先,我们关注的是"PaginationInterceptor.java",这是一个常见的分页拦截器实现。在MyBatis中,我们可以创建自定义...

    传智燕青 mybatis 课堂笔记

    5. **参数映射与结果映射**:学习如何通过@Param和@Result注解或者和元素进行参数和结果的映射,以实现动态传参和复杂结果集的处理。 6. **动态SQL**:深入理解MyBatis中的动态SQL,包括if、choose、when、...

    mybatis增删改查实例

    关于多参数传参,MyBatis支持多种方式传递参数,如使用`@Param`注解的注解式传参,或者在XML映射文件中使用`<bind>`标签绑定参数。在复杂场景下,还可以使用Map或者自定义Pojo类来封装多个参数。 在实际应用中,...

    mybatis多条件查询处理方案(查询条件为数据库字段非传递参数).pdf

    在MyBatis中,多条件查询是常见的需求,特别是在数据检索和过滤时。通常,我们会根据传递的参数来决定查询的条件。然而,有时我们可能需要根据数据库字段本身的状态来进行查询,而不是依赖于传递的参数。针对这种...

    mybatis入门之jdbc操作数据库

    在本文中,我们将探讨如何利用JDBC(Java Database Connectivity)在MyBatis中操作数据库,这是初学者入门MyBatis的基础步骤。我们将涵盖连接数据库、预处理语句、传递参数、处理结果集以及关闭资源等关键知识点。 ...

    postgresql + mybatis传入时间参数的问题.md

    我们看到, 直接在可视化工具里用SQL写 ccf.last_update_timestamp between TIMESTAMP '2019-12-13' AND TIMESTAMP '2019-12-13...但是在mapper文件中这么写就不可以了, 它会提示你varchar类型不能和日期类型进行比较

    马士兵 mybatis学习笔记

    MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 马士兵老师的MyBatis学习笔记主要涵盖了以下几个核心知识点: 1. **...

    Mybatis调用PostgreSQL存储过程实现数组入参传递

    在IT行业中,数据库管理和ORM框架的应用是至关重要的。在本文中,我们将探讨如何在Mybatis框架中调用PostgreSQL的存储过程,特别是处理 PostgreSQL 的数组类型作为存储过程的输入参数。Mybatis是一个流行的Java持久...

    mybatis like传值

    1. **语法结构**:此方式先通过Java代码将带有前缀和后缀的字符串存入Map中,再通过MyBatis的`#{}`占位符获取参数。 2. **优点**: - **灵活性高**:可以通过Java逻辑控制参数的构建过程,适用于更复杂的业务逻辑...

    mybatis入门

    - `mapper.xml`中`$`和`#`取值的区别: - `#`将传入的数据视为字符串,并自动添加双引号,可以防止SQL注入。 - `$`将传入的数据直接拼接到SQL中,不安全,容易导致SQL注入,主要用于传入表名或列名。 #### 五、...

Global site tag (gtag.js) - Google Analytics