(一)传参时给定模糊查询的标识
我们在配置文件中没有加入%来作为模糊查询的条件,所以在传入字符串实参时,就需要给定模糊查询的标识
%
- 在持久层接口中添加模糊查询方法
/** * 根据名称模糊查询 * @param username * @return */ List<User> findByName(String username);
- 映射配置文件中配置
<select id ="findByName" resultType="com.test.domain.User" parameterType="String"> select * from user where username like #{username} </select>
- 测试
@Test public void testFindByName(){ List<User> users = userDao.findByName("%王%"); for(User user : users){ System.out.println(user); } }
在控制台的执行语句
(二)配置文件中配置
- 更改配置文件。
将上面的#{}
占位符,改成了${value}
。<select id ="findByName" resultType="com.test.domain.User" parameterType="String"> select * from user where username like '%${value}%' </select>
- 测试
@Test public void testFindByName(){ List<User> users = userDao.findByName("王"); for(User user : users){ System.out.println(user); } }
在控制台的执行语句
【总结】
这两种方式的实现效果是一样的,但执行的语句是不一样的
#{}和${}的区别
#{}:
表示一个占位符
。通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,可以有效防止sql注入。#{}可以接收简单类型值或POJO属性值。如果preparedStatement传输单个简单类型值,#{}括号中可以是value或其他名称。
${}:
表示拼接sql串
;通过${}
可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换
,${}
可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值,${}括号中只能是value。
意思是,配置文件中的名称只能叫value,不能换(如下)