MyBatis中#{ }和${ }的区别
程序员文章站
2022-07-14 11:11:03
...
原文地址:MyBatis中#{ }和$ { }的区别
MyBatis中#{ }
和${ }
都可以用来动态传递参数,补全SQL语句,但它们区别也很明显。
(1)#{"参数名"}
在SQL中相当于一个参数占位符“?”,用来补全预编译语句。它补全预编译语句时,可以理解为在此参数值两端加了单引号。举例如下,当需要动态的按id查询用户信息时。
select * from my_user where id = #{id};
如果我们为id赋值为1,这条SQL执行效果相当于下面的SQL。
select * from my_user where id = '1';
由于预编译SQL使用PreparedStatement对象抽象预编译语句,之后使用也无需再次编译,而且能够防止注入式攻击,所以只要能够使用#{ }
解决的地方,我们都应该使用#{ }
。
(2)${"参数名"}
就是单纯的字符串拼接,拼接完成后才会对SQL进行编译、执行,所以性能较低,也无法复用。但是在有些#{ }
无法胜任的地方,还是会需要${ }
来完成。比如当SQL中数据库表名为参数时,如果使用#{ }
,如下所示。
select * from #{tableName};
当我们为tableName赋值为"my_user"时,相当于执行以下SQL。
select * from 'my_user';
由于表名不能加单引号,所以语法错误。这时候就需要使用${ }
来进行字符串拼接。
select * from ${tableName};
为tableName赋值为"my_user"后,相当于执行以下SQL。
select * from my_user;
上一篇: mybatis中$和#的区别
下一篇: poi
推荐阅读
-
mssql和sqlite中关于if not exists 的写法
-
Oracle SQL中实现indexOf和lastIndexOf功能的思路及代码
-
oracle存储过程中return和exit区别概述及测试
-
详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始
-
ms sql server中实现的unix时间戳函数(含生成和格式化,可以和mysql兼容)
-
PHP和MySql中32位和64位的整形范围是多少
-
SQL中distinct 和 row_number() over() 的区别及用法
-
Python中的anydbm模版和shelve模版使用指南
-
C#中38个常用运算符的优先级的划分和理解
-
对numpy和pandas中数组的合并和拆分详解