欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mybatis中#与$的区别

程序员文章站 2022-04-22 10:33:44
...

前言

最近在写代码过程中遇到一个问题,这里简单做下描述。本意想写如下这么一条SQL。

SELECT t.id, t.name, t.version, t.module, t.test_type, t.platform, t.test_case, t.test_group FROM UI_TEST_SUIT AS t WHERE t.id in (1,2);

库中确实存在id为1,2的这两条记录,但是我用mybatis查询的时候,永远只能查出id为1的这条记录,这是为什么呢?

错误代码展现

	<select id="getSpecificTestSuits" parameterType="java.util.HashMap" resultMap="TestSuit">
		SELECT <include refid="Base_Column_List" />
		FROM UI_TEST_SUIT AS t
		WHERE t.id in (#{testSuits});
	</select>

其中在DAO中的实现则为:

 public List<TestSuit> getSpecificTestSuits(@Param("testSuits") String testSuits);

传进来的时候,testSuits为1,2的字符串。

修改后的正确代码

	<select id="getSpecificTestSuits" parameterType="java.util.HashMap" resultMap="TestSuit">
		SELECT <include refid="Base_Column_List" />
		FROM UI_TEST_SUIT AS t
		WHERE t.id in (${testSuits});
	</select>

只是将原来的#换成了$。

#和$的区别

  1. 两者都是动态的向sql语句中传入需要的参数
  2. #传入的参数在SQL中显示为字符串
    例如:原先的错误写法是,实际sql就相当于SELECT t.id, t.name, t.version, t.module, t.test_type, t.platform, t.test_case, t.test_group FROM UI_TEST_SUIT AS t WHERE t.id in (‘1,2’);
  3. $传入的参数在SqL中直接显示为传入的值
    例如刚刚的正确写法才是SELECT t.id, t.name, t.version, t.module, t.test_type, t.platform, t.test_case, t.test_group FROM UI_TEST_SUIT AS t WHERE t.id in (1,2);
  4. #可以防止SQL注入的风险(语句的拼接)
  5. #{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。
  6. ${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
  7. #{}方式一般用于传入字段值,并将该值作为字符串加到执行sql中,一定程度防止sql注入;
  8. ${}方式一般用于传入数据库对象,例如传入表名,不能防止sql注入,存在风险。