前置:需要先创建好项目,并且使用mabtis根据数据表生成好代码
mybatis plus自动生成代码(代码生成器)_wa1ttinG的博客-CSDN博客
一、controller层定义
controller层就是和用户打交道,直接与前端进行交互。可调用service层,要先的到对象一般使用自动装配,因此controller层总是使用@Autowired得到一个service对象。
二、controller类简单示例
定义了一个对与教师的teacher的controller业务
@RestController
@RequestMapping("/eduservice/teacher")
public class EduTeacherController {
@Autowired
private EduTeacherService teacherService;
@GetMapping("findAll")
public List<EduTeacher> findAllTeacher() {
List<EduTeacher> list = teacherService.list(null);
return list;
}
}
teacherService是由mabtis自动创建的Service层
将返回值作为json对象返回:@RestController @ResponseBody
其源码
package org.springframework.web.bind.annotation;
import ...
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}
就是可以看到其有两个注解@Controller和@ResponseBody(注解具有继承性?),RestController是这两个的结合体,也就是@Controller:创建bean对象,@ResponseBody:注解表示该方法的返回的结果(return的结果)直接转换为json数据写入 HTTP 响应正文(响应体)中,返回值就是响应结果!!
同理@RequestBody就是将请求体json转换为java数据结构(一般是类,也可以是基本数据结构)。这个类需要提前定义好,且属性名要和json对照上。
二者都是请求体json和java数据结构的互换
返回的JSON时间格式的时区也需要修改,且格式也不是我们想要的。
"2019-10-30T06:18:46.000+0000" |
进行修改,在application.properties中设置
#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
@RequestMapping
前端访问什么url 该controller进行工作,多用于Controller类上,比如
@RestController
@RequestMapping("/eduservice/teacher")
public class EduTeacherController {
那么如果前端发送请求路径是/eduservice/teacher时,由EduTeacherController接手请求,再根据细节路径和请求方式匹配Controller中函数,需要注意路径前必须要加/。
RequestMapping一般命名为模块名+mysql表名(实体名),这样可以方便的知道是对哪个模块下的哪个表的操作。
三、增删改查操作实现
前置知识1:Restful路径
假设要对教师teacher进行操作
方式 | url | 意义 |
get | /teacher | 获取全部员工信息 |
get | /teacher/{id} | 获取该id的员工信息 |
post | /teacher | 添加(一条)员工信息 |
put | /teacher | 更新员工信息 |
delete | /teacher/{id} | 删除员工信息 |
助记:
1、获取全部教师信息不需要添加id、更新和添加教师信息使用post方式传给后端一个类,也不需要额外指明id。
2、此外添加员工和更新员工由于需要在请求体中添加json信息,get,delete请求不能携带请求体,而put和delete能够携带请求体,所以添加员工和更新员工肯定是post或get请求。
HTTP请求的GET,DELETE请求能有body吗?_delete请求可以传body吗_qq_34412985的博客-CSDN博客
比如我要更新员工信息,因为要在请求体中携带员工的具体信息,因此使用请求为post或put,又因为url不需要id值(id值在请求体中),因此url没有id。
前置知识2:四种请求方式匹配
@GetMapping、@PostMapping、@DeleteMapping、@PutMapping
四种mapping通常作用于controller层中的函数上
这个路径可以不加/,随意,与所属controller的mapping拼接形成最终的访问路径。
1、查询所有数据
@GetMapping("findAll")
public List<EduTeacher> findAllTeacher() {
List<EduTeacher> list = teacherService.list(null);
return list;
}
比如@GetMapping("findAll"),就是前端发送的Get请求、且url是"/eduservice/teacher/findAll",此时该 函数就会生效,处理该请求。
2、删除一个数据
再比如删除操作,因为RequestMapping已经设定好了模块与表名的url:"/eduservice/teacher"
此时我们只需要在url上一个员工id就好了,并且使用的是delete方法,这样就可以通过url:"/eduservice/teacher/{某个id}"来调用该删除功能。
@DeleteMapping("{id}")
public boolean removeTeacher(@PathVariable String id){
boolean flag = teacherService.removeById(id);
return flag;
}
我们在参数中使用到了 @PathVariable 这个注解,@PathVariable String id是一种省略的写法,实际上就是@PathVariable(value="id") String id,将url的id映射到id这个变量上来。
3、添加一个数据
@PostMapping("addTeacher")
private R addTeacher(@RequestBody EduTeacher eduTeacher) {
Boolean save=teacherService.save(eduTeacher);
if (save) {
return R.ok();
} else {
return R.error();
}
}
controller返回值
mybatis在mapper层的增删改操作的返回值都是一个int类型的result,表示最终作用的行数,查操作则返回结果值或实体对象
mybatis在server层的增删改的实现的返回值都是一个bolean类型的值,表示是否修改成功,1为成功,0为失败,查操作则返回结果值或实体对象
因此我们的controller层增删改的返回值自然要选择bolean,因为其直接与server层交互
返回值规范