mybatis中#与$的区别

本文讲述了作者在使用MyBatis写代码时遇到的查询问题,原本只能查出id为1的记录,将#换成$后解决。还介绍了#和$的区别,#传入参数在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);

库中确实存在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注入,存在风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值