Mybatis中的Map的使用和模糊查询的需求实现及其防SQL注入优化

一.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里的数据:

image-20230326131659606

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);
    }

运行结果如下:

image-20230326131822998

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("猪");

依然可以正常的模糊查询:

image-20230326132125285

1.2.2 总结

  1. Java 代码执行的时候,传递通配符%%
  2. 在 sql 拼接中使用通配符!

猜你喜欢

转载自blog.csdn.net/weixin_52908342/article/details/129778458