现在的潮流是前端承担越来越多的责任: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代码: