1 #{}和${}的区别
#{}和${}都可以获取map中的值或者pojo对象属性的值
TbUser select5(@Param("username") String username, @Param("phone") String phone);
<select id="select5" resultType="study.wyy.mybatis.sqlmapper.model.TbUser">
select
*
from
tb_user
where
`username` = ${username} AND
`phone` = #{phone}
</select>
测试
@Test
public void test09() {
TbUser tbUser = tbUserMapper.select5("kobe","13100001111");
System.out.println(tbUser);
}
报错,观察日志输出的sql语句:
select * from tb_user where `username` = kobe AND `phone` = ?
可以看到#{}和${}的区别
- #{} : 是以预编译的形式, 将参数设置到sql语句中;就像是jdbc原生的PreparedStatement一样,占位符的形式;防止sql注入
- ${} : 取出的值直接拼装在sql语句中;会有安全问题
那这里为啥报错,是因为username的这一列是varchar类型,正确的sql
select * from tb_user where `username` = 'kobe' AND `phone` = ?
所以修改一下xml:
<select id="select5" resultType="study.wyy.mybatis.sqlmapper.model.TbUser">
select
*
from
tb_user
where
`username` = '${username}' AND
`phone` = #{phone}
</select>
这就可以了
2 #{}和${}在模糊查询的时候使用区别
TbUser selectLike(@Param("username") String username, @Param("phone") String phone);
<select id="selectLike" resultType="study.wyy.mybatis.sqlmapper.model.TbUser">
select
*
from
tb_user
where
`username` like '%${username}%' AND
`phone` like '$'#{phone}'$'
</select>
测试
@Test
public void test10() {
TbUser tbUser = tbUserMapper.selectLike("kobe","13100001111");
System.out.println(tbUser);
}
日志输出的sql:
select * from tb_user where `username` like '%kobe%' AND `phone` like '$'?'$'
明白了二者的区别,就知道该如何写了
3 总结
-
大多情况下,我们去参数的值都应该去使用#{}。
- 原生jdbc不支持占位符的地方我们就可以使用${}进行取值,比如分表、排序。。。;按照年份分表拆分
// 动态传入表名
TbUser select6(@Param("tableName") String tableName, @Param("id") Long id);
就不能使用#{tableName}取值,原生jdbc不支持在表名的位置使用占位符
<select id="select6" resultType="study.wyy.mybatis.sqlmapper.model.TbUser">
select
*
from
#{tableName}
where
id = #{id}
</select>
应该使用 t a b l e N a m e , {tableName}, tableName,{}是直接替换文本,而不是占位符的形式
<select id="select6" resultType="study.wyy.mybatis.sqlmapper.model.TbUser">
select
*
from
${tableName}
where
id = #{id}
</select>
@Test
public void test11() {
TbUser tbUser = tbUserMapper.select6("tb_user",1L);
System.out.println(tbUser);
}
类似的还有指定排序字段,是降序还是升序排序