我们假设前台与后台定完规范后就开始独立开发,那么此时我们需要考虑的仅仅是下述接口信息: ``` PUT /Teacher/{id} ``` | Type | Name | Description | Schema | | ---- | ---- | ---- | ---- | | Path | id | 更新的教师ID | Long | | Body | teacher | 更新教师数据 | Teacher | # 定义请求路径、接收请求主体 TeacherController ``` @PutMapping("{id}") ➊ @CrossOrigin("*") public void update(@PathVariable Long id, @RequestBody Teacher newTeacher) { System.out.println(id); ➋ System.out.println(newTeacher.toString()); ➋ } ``` * ➊ 接收PUT请求。 * ➋ 使用系统内置的方法打印数据到控制台。 ## `HTTP Request`测试 我们可以打开`REST Client`,然后点击`Convert request to new format`生成一个新的`HTTP Request`,也可以在`IDEA`中使用快捷键`⇧⌘N(macos)`或`Ctrl+Shift+Alt+Insert (windows)`来新建一个`HTTP Request`。并在该请求文件中输入以下信息: > linux版本的快捷键请查阅[https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html?keymap=primary\_default\_for\_windows#create-an-http-request-scratch-file](https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html?keymap=primary_default_for_windows#create-an-http-request-scratch-file) ``` PUT http://localhost:8080/Teacher/1 ➊ Content-Type: application/json ➋ ➌ { ➍ "name": "张三更新", "username": "newzhangsan", "sex": false, "email": "newzhangsan@yunzhiclub.com" } ``` * ➊ 声明请求的地址及方法 * ➋ 告诉后台我发送主体数据的类型为`json`(json只是后台接收数据的一种,我们在向后台发送主体数据时必须告诉后台数据的类型。这是由于数据传输的本质是二进制,后台是没有办法通过二进制数据来区域我们传入的数据类型的) * ➌ 此处空一行,来表示:此行以下的内容为主体内容。 * ➍ 发送给后台的`json`字符串,该字符串必须使用严格的`json`格式。 点击绿色的启动按钮,发起数据请求: ![](https://img.kancloud.cn/60/44/6044bae0ab7b7c3277e9ce88a36dc9a2_757x367.png) 由于我们在后台返回的数据为void,即未返回任何数据,所以返回的结果的响应数据为空,结果如下: ``` PUT http://localhost:8080/Teacher/1 ➊ ➎ HTTP/1.1 200 ➋ Content-Length: 0 ➌ Date: Fri, 25 Oct 2019 01:00:06 GMT ➍ ➎ <Response body is empty> ➏ Response code: 200; Time: 50ms; Content length: 0 bytes ➐ ``` * ➊ 请求地址 * ➋ 使用的协议为HTTP/1.1,返回的状态码为:200 (200代码请求正常)。 * ➌ 返回的内容长度为0 * ➍ 处理时间 (GMT时间,在该值上加8即北京时间) * ➎ 空行,分隔返回的信息。 * ➏ 告知用户返回主体的确是没有内容。如果不标记,那么后台如果返回10个空格符(换行符等)给我们,我们也会认为为空。 * ➐ 总结:响应状态200;花费时间50ms;内容长度:0字节。 > GMT格林时间:我国为东8时区,也称为GMT+8。大体原因是这样:地球24小时自转一圈,经度不同的地区看到太阳升起的时间是不一样的。由于地球自转的方向是自西向东(这就是为什么太阳从东边升起的原因),所以相隔的地区永远都是位于东侧的先看到日出。相隔的越远看到日出的时差就越大,所以我们也是可以使用看到日出的时间差来描述两地间的距离的。格林呢在我们西边,看到日出的时候比我们晚8个小时,所以如果以北京时间为标准时间的话,那么格林时间就是BJ-8。而相反的,以格林为标准时间的话,我们就是GMT+8。其实只所以以格林为标准时间,是由于我们将其所在的经度标记为0度,格林以东就是东经,格林以西就是西经。而东经180度与西经180度都是地球的半个圈,所以东经180度就等于西经180度。而地球转360度需要24个小时,那么转180就需要12个小时。这么推算,转**120**度就是需要8个小时。然后我们的时候是GMT+8,说明比格林早看到日期,那么就必然位于格式**东**边。所以北京的经度应该是**东经120度**。 此时,我们再切换至程序控制台: ![](https://img.kancloud.cn/1a/ef/1aef81a4db4c47372f54dbf0c9e6b586_706x238.png) 查看控制台信息: ![](https://img.kancloud.cn/31/79/317931c034a863cdccf61847fda58254_878x141.png) # JDBCTemplate.update 前面的章节中我们使用了`JDBCTemplate.execute()`来完成了数据的插入操作,`JDBCTemplate.execute()`实质上是执行了一条不需要返回值的`sql`语句。原则上当前也是可以完成数据的更新操作的。官方文档如是说: > You can use the`execute(..)`method to run any arbitrary SQL. Consequently, the method is often used for DDL statements. It is heavily overloaded with variants that take callback interfaces, binding variable arrays, and so on. 也就是说在进行一般的数据操作时,官方文档并不推荐我们直接`JDBCTemplate.execute()`。官方文档还说: > You can use the`update(..)`method to perform insert, update, and delete operations. Parameter values are usually provided as variable arguments or, alternatively, as an object array. 也就是说在执行数据的`插入` 、`更新`、`删除`操作时,我们应该使用`update()`方法。 ``` /** * 使用传入的数据更新某个教师的数据 * * @param id 教师ID * @param newTeacher 更新教师 */ @PutMapping("{id}") @CrossOrigin("*") public void update(@PathVariable Long id, @RequestBody Teacher newTeacher) { String sql = String.format( "update `teacher` set `name` = '%s' , `username` = '%s' , `email` = '%s' , `sex` = %s where `id` = %s", newTeacher.getName(), newTeacher.getUsername(), newTeacher.getEmail(), newTeacher.getSex().toString(), id ); this.jdbcTemplate.update(sql); ➊ } ``` * ➊ 使用update方法来完成数据的更新操作。 ## 测试 重新启动项目,重新运行`HTTP Request`测试后,我们打开数据查看`id`为1的教师数据: ![](https://img.kancloud.cn/af/45/af4541204fbeab754b9e60833a384a54_681x59.png) # 对接测试 ![](https://img.kancloud.cn/ab/9c/ab9c7c53f221513bc4ac693a51ec22b3_666x483.gif) ## BUG修复 有个小BUG就是男女不太统一,修改为男性,查看的时候是女性;修改为女性,查看的时候却是男姓。这是由于查看与修改的规范不同造成的。我们规定:0(false)男性,1(true)为女性。 依此:对应修改两个V层文件: teacher-add.component.html、teacher-edit.component.html ```html <label> <input type="radio" name="sex" [value]="false" [(ngModel)]="sex"> 男</label> <label> <input type="radio" name="sex" [value]="true" [(ngModel)]="sex"> 女</label> ``` # 参考文档 | 名称 | 链接 | 预计学习时长(分) | | --- | --- | --- | | mysql update语法介绍 | [https://www.runoob.com/mysql/mysql-update-query.html](https://www.runoob.com/mysql/mysql-update-query.html) | 10 | | 格林尼治标准时间 |[https://zh.wikipedia.org/wiki/%E6%A0%BC%E6%9E%97%E5%B0%BC%E6%B2%BB%E6%A8%99%E6%BA%96%E6%99%82%E9%96%93](https://zh.wikipedia.org/wiki/%E6%A0%BC%E6%9E%97%E5%B0%BC%E6%B2%BB%E6%A8%99%E6%BA%96%E6%99%82%E9%96%93) | 2 | | http状态码 | [https://www.runoob.com/http/http-status-codes.html](https://www.runoob.com/http/http-status-codes.html) | 5 | | JdbcTemplate update | [https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/data-access.html#jdbc-JdbcTemplate-examples-update](https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/data-access.html#jdbc-JdbcTemplate-examples-update) | 5 | | 源码地址 | [https://github.com/mengyunzhi/spring-boot-and-angular-guild/releases/tag/step2.4.5](https://github.com/mengyunzhi/spring-boot-and-angular-guild/releases/tag/step2.4.5) | - |