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

${}:

相当于statement,直接拼sql语句

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

#{}:

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

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

以下将列举例子说明:

接口:

public List findEmpsByLikeName(String lastName);

${}的mapper

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

  

对应的test:

	public void testLike(){
		EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
		List list = mapper.findEmpsByLikeName("A");
		System.out.println(list);
	}

发出的sql语句:

Preparing: select * from emp where last_name like '%A%'


#{}的mapper

  

对应的test:

	public void testLike(){
		EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
		List list = mapper.findEmpsByLikeName("%A%");
		System.out.println(list);
	}

发出的sql语句:

Preparing: select * from emp where last_name like ?


混合使用:

接口:

注意,参数为什么是map请参考mybatis的多参数查询

public List findEmpByMap(Map map);

mapper(由于有<。在xml中就是标签开始的标志,所以需要强制不解析sql语句中的<):

  

对应的test

	public void testMap(){
		EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
		Map map = new HashMap();
		map.put("lastName", "%A%");
		map.put("salary", 1200);
		map.put("tb", "emp");
		map.put("sal", "salary");
		map.put("desc", "desc");
		List list = mapper.findEmpByMap(map);
		System.out.println(list);
	}

发出的sql语句:

Preparing: select * from emp where last_name like ? and salary < ? order by salary desc


你可能感兴趣的:(mybatis)