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

前两天在学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,即所影响的记录数!

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

时间: 2024-10-11 17:00:48

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

Spring Boot开发Web应用之Thymeleaf篇

前言 Web开发是我们平时开发中至关重要的,这里就来介绍一下Spring Boot对Web开发的支持. 正文 Spring Boot提供了spring-boot-starter-web为Web开发予以支持,spring-boot-starter-web为我们提供了嵌入的Tomcat以及Spring MVC的依赖. 项目结构推荐 一个好的项目结构会让你开发少一些问题,特别是Spring Boot中启动类要放在root package下面,我的web工程项目结构如下: root package结构:

spring boot 2.0.0 + mybatis 报:Property &#39;sqlSessionFactory&#39; or &#39;sqlSessionTemplate&#39; are required

spring boot 2.0.0 + mybatis 报:Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required 无法启动 google baidu了一番,多数都提示缺少: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artif

Spring Boot 整合web层之JSON的使用

Spring Boot对web层进行了一系列的自动化配置,只需要引入web依赖,零配置,就可以直接使用spring  mvc 里面的东西,这篇看一下它对json的自动化配置: 创建一个web项目,勾选web的依赖,就可以看到依赖里面引入了json 在前后端分离的项目中,前后端的交互是通过json格式进行的.那么在Spring Boot中如何使用呢? 我们先看一个消息转化工具(HttpMessageConverter),所用的json生成都离不开它,它的作用: 1.将服务端返回的对象序列化成JSO

vs2008调用opencv2.4.9的imread()函数失败解决办法

这两天在看opencv的C++接口函数,刚开始就出现问题: 一个简单的显示图像的程序,就是运行不成功: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <string> using std::string; using namespace cv; int main() { string str="E:\\test\\LENA.BMP";

MyEclipse for Spring启动时报错&quot;An internal error occurred during: &#39;Updating indexes&#39;.Java heap space&quot;的解决办法

问题 MyEclipse for Spring在启动时,报如下错误:An internal error occurred during: 'Updating indexes'.Java heap space 解决办法 对于这种问题,可以采用禁止MyEclipse的updating indexes的方法来解决. Window -> Preferences -> Myeclipse -> Maven4Myeclipse,禁用Download repository index updates

IIS7错误:“Web服务器被配置为不列出此目录的内容”的解决办法

IIS7错误:“Web服务器被配置为不列出此目录的内容”的解决方法: 在"操作"下,点启用,此按钮将变成禁用,则可消除此错误 IIS7错误:"Web服务器被配置为不列出此目录的内容"的解决办法,布布扣,bubuko.com

chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]

chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法,原文: 默认情况下如下图 Y轴并不是从0开始,这样折现图的幅度会很大,不是正常的幅度,解决办法如下, 示例代码: window.onload = function () { var ctx = document.getElementById("canvas").getContext("2d"); window.myLine = new Chart(ctx).Line(lineChartDat

Python-使用unrar库时Couldn&#39;t find path to unrar library的解决办法

在Pycharm安装完unrar后,还要安装rar官方的库 不然运行的时候会抛出Couldn't find path to unrar library的错误 Windows: 下载rarlib的库文件,地址:http://www.rarlab.com/rar/UnRARDLL.exe 下载安装,默认设置就好了 安装完成后要设置环境变量 如果是64位操作系统 设置完环境变量后重启Pycharm Linux: 下载地址:http://www.rarlab.com/rar/unrarsrc-5.4.5

Spring Boot的web开发

Web开发的自动配置类:org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 1.1. 自动配置的ViewResolver 视图的配置mvcProperties对象中: org.springframework.boot.autoconfigure.web.WebMvcProperties.View 1.2. 自动配置静态资源 1.2.1.   进入规则为 / 如果进入SpringMVC的规则为/时,Spring Bo