【MyBatis】mybatis中#{}与${}的区别

简介: 在学习 **mybatis** 框架的过程中,我们都知道动态 **sql** 是 **mybatis** 的主要特性之一,在 **mapper** 中定义的参数传到 **xml** 中之后,在查询之前 **mybatis** 会对其进行动态解析。**mybatis** 为我们提供了两种支持动态 **sql** 的语法:`#{}` 以及 `${}`。那么它们之间的区别是什么呢?

在学习 **mybatis** 框架的过程中,我们都知道动态 **sql** 是 **mybatis** 的主要特性之一,在 **mapper** 中定义的参数传到 **xml** 中之后,在查询之前 **mybatis** 会对其进行动态解析。**mybatis** 为我们提供了两种支持动态 **sql** 的语法:`#{}` 以及 `${}`。那么它们之间的区别是什么呢?

一、相同点

   用于指定传入参数的类型

二、不同点

2.1、使用#{}字符:表示一个占位符号 相当于 ?

它代表占位符,相当于原来 **jdbc** 部分所学的 `?` ,都是用于执行语句时替换实际的数据。具体的数据是由 `#{}` 里面的内容决定的。通过 `#{}` 可以实现 **preparedStatement** 向占位符中设置值,自动进行 **java** 类型和 **jdbc** 类型转换,`#{}` 可以有效防止 **sql** 注入。`#{}` 可以接收简单类型值(为值传递)或 **pojo** 属性值(通过引用传递)。 如果 **parameterType** 传入单个简单类型值,`#{}` 括号中可以是 **value** 或其它名称。

2.2、使用${} --表示拼接 sql 串

代表字符串拼接,通过 `${}` 可以将 **parameterType** 传入的内容拼接在 **sql** 中且不进行 **jdbc** 类型转换,`${}` 可以接收简单类型值或 **pojo** 属性值,如果 **parameterType** 传入单个简单类型值,`${}`括号中只能是 **value**。

`#{}` 表示一个占位符即 `?` ,可以有效防止 **sql** 注入。在使用时不需要关心参数值的类型,**mybatis** 会自动进行 **java** 类型和 **jdbc** 类型的转换。

`#{}` 可以接收简单类型值或 **pojo** 属性值,如果传入简单类型值,`#{}` 括号中可以是任意名称。

<!-- 根据名称模糊查询用户信息 --><select id="findUserById" parameterType="String" resultType="user">select*from user where username like CONCAT(CONCAT('%', #{name}),'%')</select>

`${}` 可以将 **parameterType** 传入的内容拼接在 **sql** 中且不进行 **jdbc** 类型转换。

`${}`可以接收简单类型值或 **pojo** 属性值,如果传入简单类型值,`${}` 括号中名称只能是 **value**。


<!-- 根据名称模糊查询用户信息 --><select id="selectUserByName" parameterType="string" resultType="user">select*from user where username like'%${value}%'</select>


对于 **order by** 排序,使用 `#{}`将无法实现功能,所以必须使用`${}`, 应该写成如下形式:


ORDERBY ${columnName}

另外,对于 **mybatis** 逆向工程生成的代码中,进行模糊查询调用 **andXxxLike()** 方法时,需要手动加 `%`,如下:


CustomerExample customerExample = new CustomerExample();customerExample.or().andNameLike("%"+name+"%");


欢迎大家相互交流学习,如有不对之处,希望不吝赐教。




完结!

相关文章
|
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天】
72 0
|
4月前
|
SQL Java 数据库连接
在mybatis中#{}和${}的区别
在MyBatis中,使用#{}可以防止SQL注入,它通过预处理语句来安全地设置参数值,而${}会将传入的数据直接插入SQL语句中,不安全,通常用于传入数据库对象或在确保数据安全的情况下使用。
|
6月前
|
SQL XML Java
蓝易云 - ibatis与mybatis的区别
总的来说,MyBatis在功能性和易用性上都优于iBatis,是iBatis的改进版。
50 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