day03下
完成会员相关的功能
对照着接口文档来写,前端的接口请求是这样的
于是我们就是后端写这个服务,先写Controller层
mybatis-plus自带查询全部的方法,也就list(),注意要把这个方法给暴露出来给dubbo以实现rpc
这是查询出来的结果,接下来要实现另外的接口,也就是
要实现下面的方法
方法实现如下:
可以直接调用selectPage()进行分页查询,这是mybatis-plus自带的方法,最后为了避免每次都要自己封装PageInfoVo,在这个类里面写了静态方法
功能完成,查询的结果如下:
总之我们就是打开一个前端项目,会出错的403接口一个个的去实现就好了
我们先来查询当属性id为1时的分类有哪些
第一个是分类属性,第二个type=0表示是销售属性,type=1表示是基本规格参数
于是当你实现了第一个分类属性的方法后,发现多了一个错误。
就是要返回的到底是销售属性还是基本规格参数
接下来就要实现这个方法
和前面的步骤一模一样
查到的结果返回,于是就实现了这样的效果
要把图片上传到阿里云,具体百度java怎么上传文件到阿里云
接下来开始创建商品,创建商品是一个难点,因为你创建了一个商品,很多张表都要更新。
代码如下:
确实很复杂,因为要保存到不同的表里面,这里要注意的是前端传过来的商品信息是不包括商品id的,因为这是后端将商品保存到商品信息表后才会生成一个商品id,然后调用mybatis-plus自带的insert方法将数据插入数据库,不过难点不在这儿,而是有可能会失败,这个时候要进行事务的回滚,可能会想到的是回滚啊,加上@Transactional不就行了,但是这样的话是这个方法全部回滚,也就是说可能只是错了一小步,但是要全部重新填写,太麻烦了。
执行一个事务时要考虑哪些是必须要回滚的,哪些是可以忽略的。我们这里希望商品的核心信息出错了一定要回滚(例如这里的基本数据,sku),也就是核心信息不要受到其他信息的影响。
于是把这个大方法拆分成了几个小方法,这里最重要的是使用了ThreadLocal,保证每个线程只有自己的线程内部的变量,就是商品的id,而不会因为多线程导致线程不安全
接下来就是实现事务了,首先打开事务功能,加上注解
如果你在一个类的一个方法里调用该类的其他方法,那么无论怎么做这些都被看做是一个事务,因为spring中事务的实现是靠的aop,而aop靠的是自动代理,假如你调用一个方法,这个方法里调用了该类的其他方法,这个时候其他方法根本不会被自动代理,而是直接就被使用了,所以就没有被包装成代理类。那么现在的做法就是手动把一个类变成代理类
先开启自动代理
通过这个方法变成代理类
这样之后才能够使用try catch达到出异常时如果不是关键信息依然不会回滚,异常处的前面的都能执行,而出异常处才回滚