mybatis中select语句的模糊查询--${}与#{}

${}:

相当于statement,直接拼sql语句

如果parameterType是基本数据类型和String,是不会将{}里面的字符串当做parameterType的属性来解析,如果parameterType是HashMap或者自定义类型,就会将{}里面的字符串当成parameterType的属性来解析

#{}:

相当于preparestatement,相当于占位符?

只要{}里面的字符串不是value,就会当做parameterType的属性来解析

以下将列举例子说明:

接口:

public List<Emp> findEmpsByLikeName(String lastName);

${}的mapper

注意,如果写成'%${lastName}%',那么就会在String类中找lastName属性,这是错误的。因此要注意是否需要写成value,避免当成属性来解析

  <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


猜你喜欢

转载自blog.csdn.net/Luke_R/article/details/78495198