mybatis中占位符${}和#{}的区别

mybatis中占位符 ${} 和 #{} 的区别


"${}“和”#{}"都是在编程中用于字符串处理的语法结构,但它们通常在不同的上下文中使用,具体的区别取决于编程语言或框架的约定。以下是一些常见的使用情况:

  1. “${}”:

    • "${}"通常用于字符串插值或占位符替换。
    • 它常见于像Java的旧版JSP(JavaServer Pages)和一些模板引擎中,例如FreeMarker和Velocity。
    • 在这种情况下,"${}“用于表示将变量的值插入到字符串中。例如,如果有一个名为"username"的变量,可以在字符串中使用”${username}"来插入其值。
    • 这种语法在某些上下文中可能会导致安全漏洞,因为它可能会受到注入攻击的风险。因此,现代的Web框架通常不再鼓励或支持这种语法,而是更喜欢使用"#{}"或其他安全的方式进行字符串替换。
  2. “#{}”:

    • "#{}"通常用于表达式求值,例如在Ruby on Rails、MyBatis(Java的持久化框架)等框架中。
    • 在这种情况下,"#{}"用于执行表达式,并将其结果插入到字符串中。这样可以防止注入攻击,因为表达式会被安全地求值。
    • 例如,使用"#{}",你可以编写类似于"SELECT * FROM users WHERE username = #{username}“的查询语句,并将”#{username}"替换为实际的用户名,而不会受到SQL注入的威胁。

实例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.CustomerMapper">
	<insert id="insert">
	    INSERT INTO customers
	    VALUES (#{cust_id}, "${cust_tel}", #{cust_name}, #{address})
	</insert>
</mapper>

总的来说,"${}“和”#{}“都是在字符串中执行替换操作的方式,但它们的使用方式和安全性取决于编程语言和框架的规范。在现代的应用程序中,安全性通常是一个重要关注点,因此更倾向于使用”#{}"或其他安全的字符串替换机制。