前两天在学spring boot的时候,出现了一个很奇怪的错误,因为是第一次使用spring boot,所以没想到会遇到这种莫名其妙的bug,即调用接口删除数据库中一条记录的时候,数据库中记录事实上以及被删除了,但是却返回一个null,这就令我百思不得其解了,理论上,删除的话,会返回受影响的记录的条数。

最后排查了一圈,结果却十分令我大跌眼镜,真的很简单!下面写的代码:

  • 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);
}
  • 源数据库记录

  • 启动项目,使用httprequest调用controller调用网络接口

结果却令我大跌眼镜,竟然报服务器异常,并且空指针了

  • 查看数据库

没想到数据库竟然成功的删除了id为3的这条记录。

  • 查看控制台

在控制台上打印出了空指针,根据错误信息,定位到了site.wangxin520.springboot.dao.IndexMapper.deleteById(int)这个方法,因为返回的是null。

这时候我就有疑惑了,理论上删除返回的并不是null啊,而是影响的行数,这次这是什么情况。后来我自习的查看了一下,发现了错误的信息原来真的是很狗血的!

@Select("DELETE FROM `user` where id =#{id};")

错误就错在这个注解上,删除应该是使用注解@Delete,而不是Select。

顿时我就无语了,把这个dao接口重新修改以后,再次运行。

  • 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调用接口

  • 查看数据库

id为2的记录成功删除,并且返回一个1,即所影响的记录数!

一切正常,这个小错误真的可以说是人为的,以后得多注意!

spring boot继承web和mybatis时,调用接口删除记录出现的空指针以及解决办法的更多相关文章

  1. Spring Boot 嵌入式Web容器

    目录 前言 1.起源 2.容器启动流程解析 2.1.获取应用类型 2.2.容器启动流程 3.加载 Web 容器工厂 4.总结 前言         最近在学习Spring Boot相关的课程,过程中以 ...

  2. 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)

    MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...

  3. 使用Spring Boot开发Web项目(二)之添加HTTPS支持

    上篇博客使用Spring Boot开发Web项目我们简单介绍了使用如何使用Spring Boot创建一个使用了Thymeleaf模板引擎的Web项目,当然这还远远不够.今天我们再来看看如何给我们的We ...

  4. Spring Boot 框架下使用MyBatis访问数据库之基于XML配置的方式

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  5. Spring Boot开发Web应用之Thymeleaf篇

    前言 Web开发是我们平时开发中至关重要的,这里就来介绍一下Spring Boot对Web开发的支持. 正文 Spring Boot提供了spring-boot-starter-web为Web开发予以 ...

  6. Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题

      (转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题   这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...

  7. spring boot中使用@Async实现异步调用任务

    本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 什么是“异步调用”? “异步调用”对应的是“同步 ...

  8. spring boot 2.0.0 + mybatis 报:Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

    spring boot 2.0.0 + mybatis 报:Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required 无法启动 ...

  9. 【spring boot】5.spring boot 创建web项目并使用jsp作前台页面

    贼烦的是,使用spring boot 创建web项目,然后我再idea下创建的,but 仅仅启动spring boot的启动类,就算整个项目都是好着的,就算是能够进入controller中,也不能成功 ...

随机推荐

  1. 转载nginx+uwsgi+django

    Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...

  2. 【RF库测试】算法运算

  3. 【重要】攻击动作时间段判断~使用动画time比较动画length和使用一个变量数组做延迟

    using UnityEngine; using System.Linq; using System.Collections.Generic; [RequireComponent(typeof(Cha ...

  4. [Linux] 特殊文件 /dev/zero

    /dev/zero 是类 Unix 系统中一个特殊的文件,当读取该文件时,它会提供无限的空字符 null.它的一个主要用途是提供字符流来初始化数据存储,也就是使用空字符覆盖目标数据.另一个常见的用法是 ...

  5. N76E003的学习之路(ADC简单小例程篇)

    N76E003内嵌12位逐次逼近寄存器型(SAR)的模拟数字转换器(ADC).模数转换模块负责将管脚上的模拟信号转换为12位二进制数据.N76E003支持8通道单端输入模式.内部带隙电压(band-g ...

  6. 对C#中几个循环语句的使用,请教

    今天是在云和数据学院学习的第四天,由于各种原因···今天自己预习的循环语句的用法以及写了几个程序,也遇到各种的问题了···纠结.由于还是在学习的很初初初级,所以好多简单的方法还是不知道怎么写出来,只得 ...

  7. select选择option时触发的click事件google不兼容问题

    原先的方式,下面代码编写的问题在google浏览器下是触发不了click事件的,具体缘由不清楚,反正都可以概括为不兼容了 碰到问题时,百度到的一篇解决:http://blog.163.com/rihu ...

  8. 基于ThinkPHP3.23的简单ajax登陆案例

    本文将给小伙伴们做一个基于ThinkPHP3.2.的简单ajax登陆demo.闲话不多说.直接进入正文吧. 可能有些小伙伴认为TP自带的跳转页面挺好,但是站在网站安全的角度来说,我们不应该让会员看到任 ...

  9. Android 本地tomcat服务器接收处理手机上传的数据之环境搭建

    上一篇:Android 使用tomcat搭建HTTP文件下载服务器   本篇文章   环境:win7 + jdk1.7 + tomcat v8.0.53   工具: 1.Eclipse  Eclips ...

  10. Android ADB命令?这一次我再也不死记了!【简单说】

    https://www.jianshu.com/p/56fd03f1aaae adb的全称为Android Debug Bridge.是android司机经常用到的工具.但是问题是那么多命令写代码已经 ...