spring boot繼承web和mybatis時,調用接口刪除記錄出現的空指針以及解決辦法

前兩天在學spring boot的時候,出現了一個很奇怪的錯誤,由於是第一次使用spring boot,因此沒想到會遇到這種莫名其妙的bug,即調用接口刪除數據庫中一條記錄的時候,數據庫中記錄事實上以及被刪除了,可是卻返回一個null,這就令我百思不得其解了,理論上,刪除的話,會返回受影響的記錄的條數。java

最後排查了一圈,結果卻十分令我大跌眼鏡,真的很簡單!下面寫的代碼:web

  • controller類,這裏因爲後來數據庫sql改了,爲了測試like的搜索功能,因此前面的index方法參數並未進行及時修改,因爲本文不涉及該方法,因此請忽略!
package site.wangxin520.springboot.web;

import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import site.wangxin520.springboot.service.IndexService;

@RequestMapping("/")
@RestController
public class Index {

    @Autowired
    private IndexService indexService;
    
    /**
     * resful的風格,從path裏面獲取到id,讀取數據庫展現數據
     * @param request
     * @param id
     * @return
     */
    @RequestMapping("/{id}")
    public String index(HttpServletRequest request,@PathVariable("id") String id){
        
        Map<String, String[]> parameterMap = request.getParameterMap();
        Set<Entry<String, String[]>> entrySet = parameterMap.entrySet();
        for (Entry<String, String[]> entry : entrySet) {
            System.out.println(entry.getKey()+"\t:\t"+entry.getValue());
        }
        String name = indexService.getName(id);
        return name;
        
    }
    
    /**
     * 經過id,去刪除數據
     * @param request
     * @param id
     * @return
     */
    @RequestMapping(value="/",method={RequestMethod.DELETE})
    public String deleteById(HttpServletRequest request,Integer id){
        
        int deleteById = indexService.deleteById(id);
        
        return deleteById+"";
        
    }
    
}
  • service接口
package site.wangxin520.springboot.service;

public interface IndexService {

    /**
     * 經過id,獲取名字
     * @param id
     * @return
     */
    public String getName(String id);

    /**
     * 經過id,刪除元素
     * @param id
     * @return
     */
    public int deleteById(Integer id);
    
}
  • service實現類
package site.wangxin520.springboot.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import site.wangxin520.springboot.dao.IndexMapper;
import site.wangxin520.springboot.service.IndexService;

@Service
public class IndexServiceImpl implements IndexService{

    @Autowired
    private IndexMapper mapper;
    
    @Override
    public String getName(String id) {
        return mapper.getName(id+"%");
    }

    @Override
    public int deleteById(Integer id) {
        return mapper.deleteById(id);
    }

}
  • dao層接口,在dao層,使用的是註解的方式進行mapper的自動實現。
package site.wangxin520.springboot.dao;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface IndexMapper {

//    @Select("SELECT username FROM `user` WHERE id=#{id};")
    @Select("SELECT username from user where username LIKE #{id};")
    public String getName(String id);
    
    @Select("DELETE FROM `user` where id =#{id};")
    public Integer deleteById(int id);
}
  • 源數據庫記錄

image

  • 啓動項目,使用httprequest調用controller調用網絡接口

image

結果卻令我大跌眼鏡,居然報服務器異常,而且空指針了spring

  • 查看數據庫

image

沒想到數據庫居然成功的刪除了id爲3的這條記錄。sql

  • 查看控制檯

image在控制檯上打印出了空指針,根據錯誤信息,定位到了site.wangxin520.springboot.dao.IndexMapper.deleteById(int)這個方法,由於返回的是null。數據庫

這時候我就有疑惑了,理論上刪除返回的並非null啊,而是影響的行數,此次這是什麼狀況。後來我自習的查看了一下,發現了錯誤的信息原來真的是很狗血的!apache

@Select("DELETE FROM `user` where id =#{id};")
錯誤就錯在這個註解上,刪除應該是使用註解@Delete,而不是Select。

頓時我就無語了,把這個dao接口從新修改之後,再次運行。springboot

  • dao接口
package site.wangxin520.springboot.dao;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface IndexMapper {

//    @Select("SELECT username FROM `user` WHERE id=#{id};")
    @Select("SELECT username from user where username LIKE #{id};")
    public String getName(String id);
    
//    @Select("DELETE FROM `user` where id =#{id};")
    @Delete("DELETE FROM `user` where id =#{id};")
    public Integer deleteById(int id);
}
  • 啓動項目,使用httprequest調用接口

image

  • 查看數據庫

image

id爲2的記錄成功刪除,而且返回一個1,即所影響的記錄數!服務器

一切正常,這個小錯誤真的能夠說是人爲的,之後得多注意!網絡

相關文章
相關標籤/搜索