今天是刘小爱自学Java的第155天。
感谢你的观看,谢谢你。
学习计划安排如下:
终于把商品新增业务做完了,说个老实话我若是发点狠,一天时间多写点搞定就好了。
一篇文章的话,观感也好,结果硬生生地被我拖成了3篇文章。
一、请求相关以及实体类
无论是查询也好还是新增也罢,都是一样的思路,先确定请求相关的4块内容:
①请求路径/方式
真实路径也就是goods,请求方式为Post,一般新增业务请求都是Post请求。
这也很好理解,get请求是将参数拼接到路径后面的,而新增的请求参数是有很多的,如果用get请求,那请求路径就很长一串的了。
②返回值
通过找到对应的前端代码,可以判断其返回值为空,一般新增业务返回值都为空。
③实体类和请求参数
前端页面中的数据、Java中的数据以及数据库中的数据它们之间是如何对应起来的呢?
此处Java中的数据也就是Spu这个实体类,而json格式的数据就是前端和后台沟通的桥梁:
- 通过@RequestBody将请求中的json数据转换成Java实体类。
- 通过@ResponseBody将响应的Java实体类数据转换成的json数据。
而数据库,因为我们是使用的Mysql数据库,所以对应的就是数据表。
而我们观察请求数据除了对应Spu实体类本身的属性外,还多出了两个属性,是个sku集合,一个是spuDetail。
所以给Spu实体类中添加这两个属性,便于接受请求时将数据转换成Java对象。
但是Spu对应的数据表中并没有这两个字段,故用@Transient说明该字段是瞬态的。
瞬态字段就可以理解成接受请求考虑该字段,但在对数据库操作时不考虑该字段。
二、Java代码编写
确定了请求和实体类,Controller层代码也就直接确定了。
1Controller层代码
使用注解@RequestBody即将前端的json数据转换成Java实体类对象。
有@RequestBody也有@ResponseBody,那为何一般都不写@ResponseBody呢?
因为@RestContoller就包含了@Contoller和@ResponseBody这两个注解。
处理后的数据都是转换成了json数据再响应给前端页面的。
响应状态码也就是201,商品新增完成,其中build表示响应数据为空。
2Service层代码
这块就比较复杂了,因为涉及到了几张数据表的操作,代码很长,分成两大块来说明。
有一点值得注意的是:
此处涉及到多张数据表的操作,所以需要使用到事务,要么都成功,要么都失败。
①新增Spu
使用通用mapper根据对象选择性新增数据即可,当然这里有些细节要注意:
- spu数据表中的字段有一些前端json数据中是没有赋值的,比如id,Valid这些,所以自行添加。
- 像Saleable这个字段代表了是否上下架,这个是根据具体需求来设定是否上下架。
- 关于创建时间和修改时间这两个字段也要做一个修改,创建时间一般就是当前时间,而前端数据中的创建时间就是修改时间。
总之就是一些比较简单的细节问题,初次写业务很容易忽视掉,多写几次就好了。
②新增SpuDetail
关于spu详情,本来就是spu中的属性,只不过由于字段名较长就将其独立成一张表了。
③Sku新增
因为每次新增会有多个sku,是一个集合,所以需要将其遍历并一一完成新增操作。
关于其时间相关属性的设置也是一样的。
④初始化stock
sku代表的就是一个确定的商品,每一个sku都对应有库存量stock这个属性。
所以每次遍历的时候都要初始化stock,并将其添加到库存集合中。
最后再将库存集合批量添加到数据库中。
关于批量新增:
通用mapper中继承InsertListMapper接口可以实现批量新增,这个以前也说明过
三、说明
上述就是对新增操作的一个完整说明,代码写完之后,在前端页面保存商品信息。
会向服务器发送请求,服务器接收请求后会根据上述写的代码,依次对数据库中的4张数据表完成新增操作。
此外因为新增操作涉及到了4张数据表,都有其对应的Java实体类,有的以前就编写过,此次文章中就没有一一都说明。