Mybatis中$与#使用和区别
1.#
#{}表示一个占位符,进行参数传递的时候,会将传递的参数看作是字符串,并且加上引号,替换占位符的位置,连接到sql语句中;
#{}可以接收简单类型和pojo,如果paramaterType传递的是简单类型,#{}括号中可以是value或其他;
xml文件中代码:
// 模糊查询 #
<select id="findByName" parameterType="String" resultType="org.ali.domain.User">
select * from user where username like #{username};
</select>
测试类中代码:
// 模糊查询
@Test
public void findByName(){
String username = "%小%";
// 执行
List<User> list = userDao.findByName(username);
for(User u:list){
System.out.println(u);
}
}
测试结果:
上面可以看到控制台的预编译sql,测试类中我们写的 %小% 被当作字符串传入到sql语句中替代了?,一定也给添加上了引号,最后查询到数据库的用户信息。
2.$
利用 $进行传递参数,拼接sql,在xml的sql代码块中,要写好引号
${}也可以接收简单类型和pojo,但 如果传递的是简答类型, ${}括号中只能是value;
xml文件中代码:
<!-- 模糊查询 用户-->
<select id="findByName" parameterType="String" resultType="org.ali.domain.User">
select * from user where username like '%${value}%';
</select>
测试类中代码:
// 模糊查询
@Test
public void findByName(){
String username = "小";
// 执行
List<User> list = userDao.findByName(username);
for(User u:list){
System.out.println(u);
}
}
测试结果:
从控制台可以看到,与#不同的地方是,sql语句没有预处理,而是直接将我们在测试类中定义的字符 小 ,替换${value},拼接在xml中的sql语句中。
提醒:
- #{}与${} 都可以实现功能,但是两种方式在控制台中的过程是不相的,#{} 的jdbc类型转换可以有效的防止 sql注入(简单来说就是一些黑客在查询语句的结尾上添加额外的SQL语句,进行非法查询,窃取数据信息), ${}无法防止。
- 能用#{}就用#{},毕竟安全可靠。
IF(BOOL 学习= =FALSE)BOOL 落后=TRUE;不断的学习,我们才能不断的前进。