MyBatis中$和#的区别

简介: 动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。

动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现
1.都可以获取对象中的属性值,$[name] 和#[name]相同
2.#可以防止sql注入.先把sql中使用#的地方变成?占位 再设置参数值,

    SELECT * FROM user WHERE name = #{name} AND password  = #{password}

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

    SELECT * FROM user WHERE name = ?  AND password  = ?

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

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

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

select * from user where name = "xxx";
预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。
$会导致sql注入,可以拼接sql

  SELECT * FROM user WHERE name = $[name] AND password  = $[password]

假如 name = OR 1 = 1 OR;
最终上面的sql会变成——>

SELECT * FROM user WHERE name = OR 1 = 1 OR  AND password  = 

3.#会把传入的参数使用引号包起来
参数值?: 'name’

SELECT * FROM user WHERE name = ? AND password  = ?

总结:一般的使用#获取数据即可,在分组和排列操作值使用$,如果连接一个参数值使用$,拼接一段sql使用$.
#方式能够很大程度防止sql注入。
$方式无法防止Sql注入。
$方式一般用于传入数据库对象,例如传入表名.
一般能用#的就别用$.
在使用mybatis的时候,尽量的使用#方式

目录
相关文章
|
6月前
|
SQL 安全 Java
65MyBatis - MyBatis中 # 与 $ 的区别
65MyBatis - MyBatis中 # 与 $ 的区别
21 0
|
6月前
|
SQL XML Java
mybatis基本构成&mybatis与hibernate的区别&添加mybatis支持
mybatis基本构成&mybatis与hibernate的区别&添加mybatis支持
|
4月前
|
SQL Java 数据库连接
MyBatis与Hibernate区别
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
|
6月前
|
SQL Java 数据库连接
MyBatis之动态SQL、#与$的区别和结果映射
MyBatis之动态SQL、#与$的区别和结果映射
62 0
|
6月前
|
SQL 安全 Java
Mybatis的动态SQL及关键属性和标识的区别(对SQL更灵活的使用)
Mybatis的动态SQL及关键属性和标识的区别(对SQL更灵活的使用)
27 0
|
8月前
|
SQL XML Java
MyBatis配置中的#「」和$「」有什么区别?
Mybatis提供到的#号和$号,都是实现动态SQL的一种方式,通过这两种方式把参数传递到XML之后,在执行操作之前,Mybatis会对这两种占位符进行动态解析。
59 0
|
3月前
|
SQL 存储 Java
MyBatis与Hibernate有什么区别?
MyBatis与Hibernate有什么区别?
20 1
|
3月前
|
SQL Java 数据库连接
MyBatis与MyBatis-Plus的区别?
MyBatis与MyBatis-Plus的区别?
69 0
|
3月前
|
SQL Java 数据库连接
myabtis中为什么说 MyBatis 是半自动 ORM 映射工具?它与全自动的区别在哪里
myabtis中为什么说 MyBatis 是半自动 ORM 映射工具?它与全自动的区别在哪里
|
8月前
|
安全 Java 数据库连接
【MyBatis】核心配置文件,三大对象的作用域,#{}和${}的区别
【MyBatis】核心配置文件,三大对象的作用域,#{}和${}的区别