Java #{} 和 ${} 的含义及区别

含义

#{}是占位符
${}是拼接符

#{}

表示一个占位符,向占位符输入参数,MyBatis 会自动进行 Java 类型和 jdbc 类型的转换,且不需要考虑参数的类型,以预编译的方式传入,可以有效的防止 SQL 注入,提高系统安全性。
例如:传入字符串,MyBatis 最终拼接好的 SQL 就是参数两边加单引号。

insert into demo values(#{id} , #{username}, #{password })
insert into demo values(?,?,?)

${}

表示 SQL 的拼接,通过 ${ } 接收参数,将参数的内容不加任何修饰拼接在 SQL 中,以字符串替换方式 ${ } 替换成变量的值,可能存在 SQL 注入的安全隐患。在用于传入数据库对象,例如传入表名和列名,还有排序时使用 order by 动态参数时可以使用 ${ } 。

例如:

select * from ${tablename} order by ${
   
   column}

计算示例:

map
	page = 1
	pageSize = 5
	
select * from user limit ${
   
   (page-1)* pageSize}, ${pageSize}

区别:

用法:

#{}:为参数占位符?,即 SQL 预编译

${}为字符串替换, 即字符串拼接

运算:

#{}:可做运算
${}:不可做运算

执行流程:

#{}:动态解析 --> 预编译 --> 运行

${}: 动态解析 --> 编译 --> 运行

变量替换:

#{}:变量替换是在 JDBC中,会对变量自动加上单引号

${}:变量替换是在 JDBC 外,不会对变量加上单引号

sql注入:

#{}:可以防止 SQL 注入

${}:不可以防止 SQL 注入

使用技巧:

  • 不论是单个参数还是多个参数,一律建议使用 @param(“”)
  • 能用 #{ } 的地方尽量使用 #{ },减少 ${ }
  • 表名作为参数时,必须使用 ${ }
  • order by 时,必须使用 ${ }
  • 使用 ${} 时要注意何时加或不加单引号

猜你喜欢

转载自blog.csdn.net/weixin_45178729/article/details/129061778