集册 Spring Boot 入门实践 RESTful by Spring Boot with MySQL

RESTful by Spring Boot with MySQL

欢马劈雪     最近更新时间:2020-08-04 05:37:59

932

现在的潮流是前端承担越来越多的责任:MVC中的V和C,后端只需要负责提供数据M,但是后端有更重要的任务:高并发、提供各个维度的扩展能力(负载均衡、数据表切分、服务分离)、更清晰的API设计。Spring Boot框架提供的机制便于工程师实现标准的RESTful接口,本文主要讨论如何编写Controller代码,另外还涉及了MySQL的数据库操作,之前我也写过一篇关于Mysql的文章link,但是这篇文章加上了CRUD的操作。

先回顾下之前的文章中我们用到的例子:图书信息管理系统,主要的领域对象有book、author、publisher和reviewer。

首先我们要在pom文件中添加对应的starter,即spring-boot-starter-web,对应的xml代码示例为:

<dependency>   
     <groupId>org.springframework.boot</groupId>   
     <artifactId>spring-boot-starter-web</artifactId>
</dependency>

然后我们要创建控制器(Controller),先在项目根目录下创建controller包,一般为每个实体类对象创建一个控制器,例如BookController。

@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直接填入HTTP响应体中,是REST风格的控制器。@RequestMapping("/books")表示该控制器处理所有“/books”的URL请求,具体由那个函数处理,要根据HTTP的方法来区分:GET表示查询、POST表示提交、PUT表示更新、DELETE表示删除。

  • 查询所有图书记录:利用@Autowired导入BookRepository的Bean,直接调用bookRepository.findAllBooks()即可。我们的返回值形式如下。关于RESTful返回值形式的设计,后续会有专门的文章讨论。
{
    "message": "get all books",
    "book": [
        {
            "isbn": "9781-1234-5678",
            "title": "你愁啥",
            "description": "这是一本奇怪的书",
            "author": {
                "firstName": "冯",
                "lastName": "pp"
            },
            "publisher": {
                "name": "大锤出版社"
            },
            "reviewers": []
        },
        {
            "isbn": "9781-1234-1111",
            "title": "别吵吵",
            "description": "哈哈哈",
            "author": {
                "firstName": "杜琪",
                "lastName": "琪"
            },
            "publisher": {
                "name": "大锤出版社"
            },
            "reviewers": []
        }
    ]
}
  • 根据isbn查询图书记录:根据isbn查询一本书的记录,调用bookRepository.findBookByIsbn()即可。返回值形式如下:
{
    "message": "get book with isbn(9781-1234-5678)",
    "book": {
        "isbn": "9781-1234-5678",
        "title": "你愁啥",
        "description": "这是一本奇怪的书",
        "author": {
            "firstName": "冯",
            "lastName": "pp"
        },
        "publisher": {
            "name": "大锤出版社"
        },
        "reviewers": []
    }
}
  • 添加图书记录,客户端的图书信息封装成json字符串传递过来,因此利用@RequestBody获取POST请求体,由于book记录中有外链记录,因此要首先解析出author对象和publisher对象,并将它们存入数据库;然后才生成book对象,并调用bookRepository.save(book)将book记录存入数据库。该接口的返回值会把刚添加的图书信息返回给客户端,形式类似于getBookByIsbn这个接口。
  • 更新图书书名,这里简单以这个接口作为更新的例子。主要步骤是先取出对应isbn的book对象,然后book.setTitle(title)更新book信息,然后调用bookRepository.save(book)更新该对象的信息,通过@PathVariable修饰的参数title与URL中用“{title}”的值对应。
  • 删除图书记录;给定图书的isbn直接删除即可。

最后,放上完整的Controller代码:

展开阅读全文