前兩天在學spring boot的時候,出現了一個很奇怪的錯誤,由於是第一次使用spring boot,因此沒想到會遇到這種莫名其妙的bug,即調用接口刪除數據庫中一條記錄的時候,數據庫中記錄事實上以及被刪除了,可是卻返回一個null,這就令我百思不得其解了,理論上,刪除的話,會返回受影響的記錄的條數。java
最後排查了一圈,結果卻十分令我大跌眼鏡,真的很簡單!下面寫的代碼:web
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+""; } }
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); }
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); } }
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); }
結果卻令我大跌眼鏡,居然報服務器異常,而且空指針了spring
沒想到數據庫居然成功的刪除了id爲3的這條記錄。sql
在控制檯上打印出了空指針,根據錯誤信息,定位到了site.wangxin520.springboot.dao.IndexMapper.deleteById(int)這個方法,由於返回的是null。數據庫
這時候我就有疑惑了,理論上刪除返回的並非null啊,而是影響的行數,此次這是什麼狀況。後來我自習的查看了一下,發現了錯誤的信息原來真的是很狗血的!apache
@Select("DELETE FROM `user` where id =#{id};")
頓時我就無語了,把這個dao接口從新修改之後,再次運行。springboot
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); }
id爲2的記錄成功刪除,而且返回一個1,即所影響的記錄數!服務器
一切正常,這個小錯誤真的能夠說是人爲的,之後得多注意!網絡