在SQL语句中,使用like
进行模糊查询,例如:
select * from user where name like '王%';
在mybatis中,也是类似,用到like
做模糊查询,但在传参数时,需要注意SQL注入的问题。常见的有两种方式:
- 在传参时,直接传入%
- 在mapper.xml中提前限定好%,与传入的参数拼接。
方式一
1、在mapper层接口中,新增一个方法
//模糊查询
List<User> getNameByLike(String name);
2、在对应的mapper.xml中,新增一个SQL语句
<select id="getNameByLike" parameterType="String" resultType="com.mybatis.entity.User">
select * from mybatis.user
where name like #{name};
</select>
3、在测试类中,新增一个测试方法
//模糊查询
@Test
public void getNameByLike() {
//1、获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//2、执行SQL
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list = userMapper.getNameByLike("王%");
for (User user : list) {
System.out.println("得到的数据是:" + user);
}
//3、关闭sql连接
sqlSession.close();
}
这样,最终执行的SQL语句是select * from mybatis.user where name like '王%';
在实际开发中,不太可能在参数中直接带上%作为一个方法的入参进行传递,所以要使用这种方式的话,可能需要在java代码中,额外对入参进行拼接%之后,再作为一个新的SQL参数传递给SQL语句,这样显得有点麻烦,而且不利于维护代码。
方式二
1、我们改造一下mapper.xml中的语句,在#{name}
后加上"%"
,如下所示:
<select id="getNameByLike" parameterType="String" resultType="com.mybatis.entity.User">
select * from mybatis.user
where name like #{name}"%";
</select>
2、在测试类的方法中,入参去掉%,仅仅传具体的字段,不带任何通配符
//模糊查询
@Test
public void getNameByLike() {
//1、获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//2、执行SQL
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list = userMapper.getNameByLike("王");
for (User user : list) {
System.out.println("得到的数据是:" + user);
}
//3、关闭sql连接
sqlSession.close();
}
这样,也能查询到与方式一同样的结果。