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

简介: Mybatis中${}和#{}的区别

前言

MyBatis中动态sql是其主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在执行操作之前 mybatis 会对其进行动态解析。

MyBatis提供了两种支持动态 sql 的语法:#{} 以及 $ {},<font color = "red">其最大的区别则是#{}方式能够很大程度防止sql注入(安全),${}方式无法防止Sql注入。


SQL注入

${}方式是将形参和SQL语句直接拼接形成完整的SQL命令后,再进行编译。所以可以通过设计形参变量的值,从而改变SQL语句产生安全隐患,即为SQL注入攻击。举例说明:
在Mapper映射文件中:

<select id="findByName" parameterType="String" resultMap="ResultMap">
        SELECT * FROM user WHERE username='${value}'
    </select>

当username=" 'or 1=1 or' "传入后,${}将变量内容直接和sql语句进行拼接。

SELECT * FROM user WHERE username='' OR 1=1 OR '';

该跳语句可以将整个数据库用户内容暴露出来。

{}方式则是先用占位符代替参数将SQL语句先进行编译,然后再讲参数中的内容替换进去。因为SQL语句已经被预编译过,其SQL意图将无法通过非法的参数内容实现更改,其参数中的内容,无法变为SQL命令的一部分。

故,#{}可以防止SQL注入而${}却不行


关于#{}

  • {}表示一个占位符,相当于jdbc中的?符号

  • 当#{}传入的数据是一个字符串时,会自动将传入的数据加一个双引号。

比如:SELECT * FROM user WHERE username=#{value},如果传入的值是bbq,那么解析成sql时的值就是where username=“bbq”

  • 如果sql语句中只有一个参数,此时参数名称可以随意定义。如果sql语句有多个参数,此时参数名称应该是与当前表关联[实体类的属性名]或则[Map集合关键字],不能随便写,必须对应

关于${}

  • $ {}将传入的数据直接显示生成在sql中。如:select * from user where id= $ {user_id},如果传入的值是1006,那么解析成sql时的值为where id=1006
  • $ {value}中value值有限制只能写对应的value值不能随便写,因为${}不会自动进行jdbc类型转换
  • 在JDBC不支持使用占位符的地方,都可以使用${}

总结

  • 如果在sql语句中动态指定表名或列名时,只能使用${}
  • MyBatis排序时order by 动态参数时,只能使用${}
  • MyBatis能使用#{}的时候尽量使用#{}
  • {}不需要关注数据类型,mybatis实现自动数据类型转换;${}不做数据类型转换,需要自行判断数据类型;

目录
相关文章
|
7月前
|
SQL Java 数据库连接
hibernate和mybatis的区别
hibernate和mybatis的区别
|
1月前
|
SQL 安全 Java
MyBatis(6)#{}和${}的区别
在MyBatis中,`#{}`和`${}`是用于在SQL语句中嵌入参数的两种方式。`#{}`用于预处理参数,可以防止SQL注入;而`${}`进行直接字符串替换,适用于动态插入表名或列名,但存在SQL注入风险。建议优先使用`#{}`,并在必要时谨慎使用`${}`。
|
3月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
4月前
|
SQL Java 数据库连接
MyBatis 和 Hibernate 有什么区别?
【8月更文挑战第21天】
71 0
|
4月前
|
SQL Java 数据库连接
在mybatis中#{}和${}的区别
在MyBatis中,使用#{}可以防止SQL注入,它通过预处理语句来安全地设置参数值,而${}会将传入的数据直接插入SQL语句中,不安全,通常用于传入数据库对象或在确保数据安全的情况下使用。
|
6月前
|
SQL XML Java
蓝易云 - ibatis与mybatis的区别
总的来说,MyBatis在功能性和易用性上都优于iBatis,是iBatis的改进版。
49 2
|
7月前
|
SQL Java 数据库连接
MyBatis与Hibernate区别
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
|
6月前
|
SQL Java 数据库连接
【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
68 0
|
7月前
|
SQL 缓存 Java
|
SQL Java 数据库连接
MyBatis之动态SQL、#与$的区别和结果映射
MyBatis之动态SQL、#与$的区别和结果映射
124 0
下一篇
DataWorks