假设我们要查询一个名字里带“张”的用户,sql语句应该这样写:select * from user where name like '%张%'
。
在MyBatis里有两种方法
执行时传递通配符
UserMapper.java:1
2
3<!-- 添加方法 -->
// 模糊查询
List<User> getUserLike(String value);
UserMapper.xml:1
2
3
4<!-- 添加标签 -->
<select id="getUserLike" resultType="com.xliu.pojo.User">
select * from mybatis.user where name like #{value};
</select>
Test.java:1
2
3
4
5
6
7
8
9
10@Test
public void getUserLike() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserLike("%张%");
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
在Sql拼接中使用通配符
UserMapper.java:1
2
3<!-- 添加方法 -->
// 模糊查询
List<User> getUserLike(String value);
UserMapper.xml:1
2
3
4<!-- 添加标签 -->
<select id="getUserLike" resultType="com.xliu.pojo.User">
select * from mybatis.user where name like "%"#{value}"%";
</select>
Test.java:1
2
3
4
5
6
7
8
9
10@Test
public void getUserLike() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserLike("张");
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
对比
两种方法的区别在于通配符”%”到底应该由用户传入(方法一)还是应该在xml中拼接,这样用户只需要输入“张”即可。第二种方法的优点是可以防止Sql注入。
Sql注入
Sql注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
在第一种方法中,用户对于将要执行的sql语句有较高的自由度,因为我们将select * from user where name like
之后的内容都交给用户来写,那么用户可能可以执行非法操作。如果我们使用第二种方法,用户只有权限去输入通配符中间的值,大大降低了Sql注入的风险。