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>
只是将原来的#换成了$。
#和$的区别
- 两者都是动态的向sql语句中传入需要的参数
- #传入的参数在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’); - $传入的参数在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); - #可以防止SQL注入的风险(语句的拼接)
- #{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。
- ${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
- #{}方式一般用于传入字段值,并将该值作为字符串加到执行sql中,一定程度防止sql注入;
- ${}方式一般用于传入数据库对象,例如传入表名,不能防止sql注入,存在风险。
上一篇: MybatisPlus的使用