一.Map的使用和模糊查询的需求实现及其防SQL注入优化
1.1 Map的使用
替换之前的根据ID查询信息:
1.编写接口:
User getUserById2(Map<String,Object> map);
2.编写对应的mapper对应的sql语句:
<select id="getUserById2" parameterType="map" resultType="com.zhu.pojo.User">
select * from mybatis.user where id = #{helloid} and name = #{name};
</select>
3.编写测试类:
@Test
public void getUserById2(){
SqlSession sqlSession = Mybatisutils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("helloid",2);
mapper.getUserById2(map);
sqlSession.close();
}
以增加用户为例:
1.编写接口:
int addUser2(Map<String,Object> map);
2.编写对应的mapper对应的sql语句:
<insert id="addUser2" parameterType="map" >
insert into mybatis.user (id,name,pwd) values (#{Userid},#{Username},#{Userpwd});
</insert>
3.编写测试类:
@Test
public void addUser2(){
SqlSession sqlSession = Mybatisutils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("Userid",5);
map.put("Username","34234234");
map.put("Userpwd","你好");
mapper.addUser2(map);
sqlSession.close();
}
Map 传递参数, 直接在 sql 中取出 key 即可!【parameter Type=“map”】
对象传递参数, 直接在 sql 中取对象的属性即可!【parameter Type=“Object”】
只有一个基本类型参数的情况下, 可以直接在 sql 中取到!
多个参数用 Map, 或者注解!
1.2 模糊查询的实现
在sql中,可以根据某些特定的条件进行模糊查询,比方说要查找咦某个字母开头的昵称,或者一组类似的数据等。我们用字段like表示相似,来进行模糊查询。
在模糊查询中,%表示任意字符,_表示一个字符。
1.先看sql里的数据:
2.编写接口:
List<User> getUserLike(String name);
3.编写SQL模糊语句查询:
<select id="getUserLike" resultType="com.zhu.pojo.User">
select * from mybatis.user where name like #{value};
</select>
4.编写测试类:
@Test
public void getUserLike(){
SqlSession sqlSession = Mybatisutils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userLike = mapper.getUserLike("%猪%");
for (User user : userLike) {
System.out.println(user);
}
运行结果如下:
1.2.1 防SQL注入优化
比如在平时的模糊查询中,有用户输入了 1 or 1=1 ,这样就会把整个表爆出。
为了防止这种情况,我们理应直接在XML里规定其SQL语句的规范。
<select id="getUserLike" resultType="com.zhu.pojo.User">
select * from mybatis.user where name like "%"#{value}"%";
</select>
那么测试类里的代码:
List<User> userLike = mapper.getUserLike("猪");
依然可以正常的模糊查询:
1.2.2 总结
- Java 代码执行的时候,传递通配符%%
- 在 sql 拼接中使用通配符!