数据库user表的数据如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210128152614818.png)
查询方式一(推荐):
#{ }引用参数
<!-- 模糊查询 方式一:#{}-->
<select id="findByUserName" resultMap="userResultMap" parameterType="string">
<!--#{}:表示占位符,引用参数时会自动填充单引号
#{}中的值,必须与User对象的属性名一致,准确说,是与各个属性的get方法后面的名称首字母小写一致
#{}中的值,如果是基本数据类型,或String,且只有一个占位符时,可以随便写-->
select * from user where username like #{username}
</select>
方式一测试代码:
/**
* 模糊查询测试:方式一
*/
@Test
public void test4() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//返回的是UserMapper所产生的代理对象, 底层:JDK动态代理 实际类型:proxy
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.findByUserName("%子%");
for (User u:users){
System.out.println(u);
}
sqlSession.close();
}
方式一查询结果:
查询方式二(不推荐,存在sql注入问题):
<!-- 模糊查询 方式二(不推荐,会导致sql注入问题):-->
<select id="findByUserName2" resultMap="userResultMap" parameterType="string">
<!--${}:sql原样拼接-->
select * from user where username like '${xxx}'
</select>
方式二测试代码
/**
* 模糊查询测试:方式二
*/
@Test
public void test5() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//返回的是UserMapper所产生的代理对象, 底层:JDK动态代理 实际类型:proxy
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.findByUserName2("%子%");
for (User u:users){
System.out.println(u);
}
sqlSession.close();
}
方式二查询结果
方式二测试SQL注入的代码
public void test5() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.findByUserName2("%子% 'or '1=1"); //测试SQL注入问题
for (User u:users){
System.out.println(u);
}
sqlSession.close();
}
方式二测试SQL注入查询结果
总结
#{ }方式、${ } 方式引用参数的区别:
相同点:
- 俩种方式都可以接收简单类型参数值 或者 pojo属性值
不同点:
- #{ }可以防止SQL注入 ,是推荐使用的方式
表示占位符号,可以实现将prepareStatement向占位符中设置值,自动进行java类型和jdbc类型转换,parameterType为什么类型, 传入的参数就会被识别为指定类型,不会存在sql注入(像%子% 'or ‘1=1这样的参数,会被识别为:username LIKE "’%子% 'or ‘1=1’",而不是username LIKE '%子% 'OR ‘1=1’) - ${ }存在SQL注入问题,不推荐使用
将parameterType传入的内容拼接在sql中,不会进行jdbc类型转换,因此会出现sql注入问题