${}:
相当于statement,直接拼sql语句
如果parameterType是基本数据类型和String,是不会将{}里面的字符串当做parameterType的属性来解析,如果parameterType是HashMap或者自定义类型,就会将{}里面的字符串当成parameterType的属性来解析
#{}:
相当于preparestatement,相当于占位符?
只要{}里面的字符串不是value,就会当做parameterType的属性来解析
以下将列举例子说明:
接口:
public List<Emp> findEmpsByLikeName(String lastName);
${}的mapper
注意,如果写成'%${lastName}%',那么就会在String类中找lastName属性,这是错误的。因此要注意是否需要写成value,避免当成属性来解析
扫描二维码关注公众号,回复:
3754633 查看本文章
<select id="findEmpsByLikeName" parameterType="string" resultType="emp">
select * from emp where last_name like '%${value}%'
</select>
对应的test:
public void testLike(){
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
List<Emp> list = mapper.findEmpsByLikeName("A");
System.out.println(list);
}
发出的sql语句:
Preparing: select * from emp where last_name like '%A%'
#{}的mapper
<select id="findEmpsByLikeName" parameterType="string" resultType="emp">
select * from emp where last_name like #{value}
</select>
对应的test:
public void testLike(){
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
List<Emp> list = mapper.findEmpsByLikeName("%A%");
System.out.println(list);
}
发出的sql语句:
Preparing: select * from emp where last_name like ?
混合使用:
接口:
注意,参数为什么是map请参考mybatis的多参数查询
public List<Emp> findEmpByMap(Map<String,Object> map);
mapper(由于有<。在xml中就是标签开始的标志,所以需要强制不解析sql语句中的<):
<select id="findEmpByMap" resultType="emp" parameterType="map">
<![CDATA[
select * from ${tb} where last_name like #{lastName} and salary < #{salary}
order by ${sal} ${desc}
]]>
</select>
对应的test
public void testMap(){
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("lastName", "%A%");
map.put("salary", 1200);
map.put("tb", "emp");
map.put("sal", "salary");
map.put("desc", "desc");
List<Emp> list = mapper.findEmpByMap(map);
System.out.println(list);
}
发出的sql语句:
Preparing: select * from emp where last_name like ? and salary < ? order by salary desc