山东大学项目实训-地图圈系统-后端开发(3)

部分表的基本接口开发

一、login表基本接口开发

1、接口开发

在Spring Boot项目中的repository下创建LoginRepository.java,写入以下代码:

package com.example.demo.repository;

import com.example.demo.entity.Login;
import org.springframework.data.jpa.repository.JpaRepository;

public interface LoginRepository extends JpaRepository<Login, String> {
}

在controller下创建LoginController.java,写入以下代码:

package com.example.demo.controller;

import com.example.demo.entity.Login;
import com.example.demo.repository.LoginRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/login")
public class LoginController {
    @Autowired
    private LoginRepository loginRepository;

    @GetMapping("/findall")
    public List<Login> findall() {
        return loginRepository.findAll();
    }

    @GetMapping("/findbyid/{id}")
    public Login findbyid(@PathVariable("id") String id) {
        return loginRepository.findById(id).get();
    }

    @DeleteMapping("/deletebyid/{id}")
    public String deletebyid(@PathVariable("id") String id) {
        loginRepository.deleteById(id);
        return "Success delete!";
    }

    @GetMapping("/count")
    public Long count() {
        return loginRepository.count();
    }
}

注解@RequestMapping 用来映射请求,也就是通过它来指定控制器可以处理哪些URL请求。

注解@GetMapping用于处理请求方法的GET类型。

注解@DeleteMapping用于处理请求方法的DELETE类型。

注解@PostMapping用于处理请求方法的POST类型,但我在现阶段的后端开发中并未涉及,之后应该会涉及到。

其中包含了三个GET方法和一个DELETE方法,根路径是/login,接口/login/findall用来返回login表中的所有数据,接口/login/findid根据主键查询数据并返回,接口/login/deletebyid用来根据主键删除数据,接口/login/count用来返回表中的记录数,也就是行数。

2、接口测试

打开Navacat,连接dituquan数据库,在login表中插入以下两条测试数据:

山东大学项目实训-地图圈系统-后端开发(3)

运行Spring Boot项目,打开Postman进行接口测试。

测试http://localhost:9001/login/findall,返回结果如下:

[

  {

    "username": "111",

    "password": "111",

    "identity": "111",

    "head_img": "111",

    "province": "111"

  },

  {

    "username": "sss",

    "password": "sss",

    "identity": "sss",

    "head_img": "sss",

    "province": "sss"

  },

  {

    "username": "ttt",

    "password": "ttt",

    "identity": "ttt",

    "head_img": "ttt",

    "province": "ttt"

  }

]

可以看到,返回结果中包含了最初添加进login表中的所有3条数据!

测试http://localhost:9001/login/findbyid/111,返回结果如下:

{

  "username": "111",

  "password": "111",

  "identity": "111",

  "head_img": "111",

  "province": "111"

}

可以看到,返回结果是主键username为111的数据!

换个参数继续测试,http://localhost:9001/login/findbyid/sss,返回结果如下:

{

  "username": "sss",

  "password": "sss",

  "identity": "sss",

  "head_img": "sss",

  "province": "sss"

}

可以看到,返回结果是主键username为sss的数据!

测试http://localhost:9001/login/deletebyid/sss,返回结果如下:

Success delete!

打开Navacat查看login表:

山东大学项目实训-地图圈系统-后端开发(3)

可以看到数据“sss”成功删除!

测试接口http://localhost:9001/login/count,返回结果如下:

2

很明显,接口返回了表login中记录的总个数!

3、遇见的问题

Spring Boot项目给出一个关于.get()方法的警告,如下:

@GetMapping("/findbyid/{id}")
public Login findbyid(@PathVariable("id") String id) {
    return loginRepository.findById(id).get();
}

警告:‘Optional.get()’ without ‘isPresent()’ check。读字面意思好像是说没有进行存在性检查,猜测与数据库中不包含主键对应的记录时的情况有关,进一步百度,得到如下结果:其返回的是Optional类型,该类型是为了规避NULL错误,应该使用orElse(“如果值为null的替代值”) 替代 get() 。

打开Postman进行测试

测试接口http://localhost:9001/login/findbyid/222,其中主键值为“sss”,但是login表中并不存在该记录,得到返回结果如下:

{

  "timestamp": "2021-03-28T12:50:07.062+00:00",

  "status": 500,

  "error": "Internal Server Error",

  "message": "",

  "path": "/login/findbyid/222"

}

返回的status为500,明显出错。

于是修改.get()为.orElse(null),如下:

@GetMapping("/findbyid/{id}")
public Login findbyid(@PathVariable("id") String id) {
    return loginRepository.findById(id).orElse(null);
}

再次测试接口http://localhost:9001/login/findbyid/222,其中主键值为“sss”,但是login表中并不存在该记录,得到返回结果为空(接口并没有报错)。

二、总结

这是很关键的一周,完事开头难,通过这一周的学习,在网上搜教程,在哔哩哔哩上看一些相关的Spring Boot项目教学视频,对Spring Boot项目的开发有了初步的掌握,学会了如何具体的开发接口,并进行了接口开发的尝试,开发了两个表的一些基本的接口,设计到了GET方法和DELETE方法,在接下来的开发中,想必还会涉及到其他类型的方法,还会学到其他的接口代码编写方式。这一周只是针对两个表编写了一些很基本的接口,随着项目的进行,前端同学针对这两个表肯定还会有更多的需求,我还会再编写更多的不同需求的接口。任重道远,继续努力!

上一篇:第 111 天:Python 垃圾回收机制


下一篇:Linux-comm