本文用来记录实现功能的一些代码。
分布式项目工作流程:
以user中的部分代码为例,讲一下代码的书写构造。
将gmall-user项目拆分成gmall-user-web和gmall-user-service两个项目之后。
将bean和service类都集成到gmall-api项目中。
配置文件都封装到util后缀的项目中。
在子项目中的pom依赖中进行配置依赖。
首先是前端gmall-user-web项目中的UserController文件:
@Controller //注意这里要使用controller注释
public class UserController {
@Reference
UserService userService; //这里是api项目中的UserService这个类
@RequestMapping("getReceiveAddressByMemberId") //前端给到getReceiveAddressByMemberId这个方法,使用RequestMapping处理请求地址映射
@ResponseBody //使用ResponseBody修饰符使得返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中
public List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId){//返回一个list,这个方法调用service中的同名方法
//service接口类放在api项目中,实现放在service项目中的impl中
List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = userService.getReceiveAddressByMemberId(memberId);
return umsMemberReceiveAddresses;
}
@RequestMapping("getAllUser")
@ResponseBody
public List<UmsMember> getAllUser(){
List<UmsMember> umsMembers = userService.getAllUser();
return umsMembers;
}
@RequestMapping("index")
@ResponseBody
public String index(){
return "hello user";
}
接着是UserService接口(在api项目中):
public interface UserService {
List<UmsMember> getAllUser();
List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId);
}
接着通过UserServiceImpl实现这个接口(在service项目中):
@Service
public class UserServiceImpl implements UserService {//在这里UserServiceImpl实现UserService接口
@Autowired
UserMapper userMapper;//自动注入我们的通用mapper
@Autowired
UmsMemberReceiveAddressMapper umsMemberReceiveAddressMapper;
@Override
public List<UmsMember> getAllUser() {
//测试通用Mapper
List<UmsMember> userMemberList = userMapper.selectAll();//userMapper.selectAllUser();
return userMemberList;
}
@Override
public List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId) {
// 封装的参数对象
UmsMemberReceiveAddress umsMemberReceiveAddress = new UmsMemberReceiveAddress();
umsMemberReceiveAddress.setMemberId(memberId);
List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = umsMemberReceiveAddressMapper.select(umsMemberReceiveAddress);
// Example example = new Example(UmsMemberReceiveAddress.class);
// example.createCriteria().andEqualTo("memberId",memberId);
// List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = umsMemberReceiveAddressMapper.selectByExample(example);
// //example与update一起用,更新的时候用,查询的时候不能用
return umsMemberReceiveAddresses;
}
这里是调用了我们基于通用mapper写好的mapper方法完成单表的查询:
import com.atguigu.gmall.bean.UmsMemberReceiveAddress;
import tk.mybatis.mapper.common.Mapper;
public interface UmsMemberReceiveAddressMapper extends Mapper<UmsMemberReceiveAddress> {
}
package com.atguigu.gmall.user.mapper;
import com.atguigu.gmall.bean.UmsMember;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
//通用Mapper
public interface UserMapper extends Mapper<UmsMember> {
}
整体的流程:
首先是web项目中的controller类获得前端界面的请求地址映射。
然后controller类里面定义的同名方法会返回api项目中的service接口中的返回结果。
service接口则是通过service项目中的impl方法进行实现。
impl方法会调用我们写好的基于通用mapper写的关于单表查询的方法。
– controller放在web中,impl和mapper放在service项目中,bean和service接口放在api中
user项目中
1、返回所有用户
@Override
public List<UmsMember> getAllUser() {
List<UmsMember> userMemberList = userMapper.selectAll();
return userMemberList;
}
2、根据给定的memberId查询收件地址
使用映射做一个查询,查询哪个条件不为空,就封装成一个list对象,返回结果。
首先是new一个UmsMemberReceiveAddress()对象
然后使用bean类中的setMemberId方法将memberId这个id赋值给当前对象
然后通过通用mapper查询这个对象。
将当前这个memberid下的地址封装成一个list返回。
@Override
public List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId) {
// 封装的参数对象
UmsMemberReceiveAddress umsMemberReceiveAddress = new UmsMemberReceiveAddress();
umsMemberReceiveAddress.setMemberId(memberId);
List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = umsMemberReceiveAddressMapper.select(umsMemberReceiveAddress);
return umsMemberReceiveAddresses;
}
manage项目中
1、分类查询
这里是查询三级分类的代码。
一级分类直接在pmsBaseCatalog1Mapper中selectall
Mapper 封装PmsBaseCatalog1对象
--public interface PmsBaseCatalog1Mapper extends Mapper<PmsBaseCatalog1> {}
二级分类是在给定一级分类idcatalog1Id的情况下进行查询
同之前一样还是通过映射的形式进行查询
先new一个二级分类对象
然后将一级分类的id set进去
然后查询非空的,返回封装成一个list
三级分类同二级分类查询
给定一个二级分类id
@Service
public class CatalogServiceImpl implements CatalogService {
@Autowired
PmsBaseCatalog1Mapper pmsBaseCatalog1Mapper;
@Autowired
PmsBaseCatalog2Mapper pmsBaseCatalog2Mapper;
@Autowired
PmsBaseCatalog3Mapper pmsBaseCatalog3Mapper;
@Override
public List<PmsBaseCatalog1> getCatalog1() {
return pmsBaseCatalog1Mapper.selectAll();
}
@Override
public List<PmsBaseCatalog2> getCatalog2(String catalog1Id) {
PmsBaseCatalog2 pmsBaseCatalog2 = new PmsBaseCatalog2();
pmsBaseCatalog2.setCatalog1Id(catalog1Id);
List<PmsBaseCatalog2> pmsBaseCatalog2s = pmsBaseCatalog2Mapper.select(pmsBaseCatalog2);
return pmsBaseCatalog2s;
}
@Override
public List<PmsBaseCatalog3> getCatalog3(String catalog2Id) {
PmsBaseCatalog3 pmsBaseCatalog3 = new PmsBaseCatalog3();
pmsBaseCatalog3.setCatalog2Id(catalog2Id);
List<PmsBaseCatalog3> pmsBaseCatalog3s = pmsBaseCatalog3Mapper.select(pmsBaseCatalog3);
return pmsBaseCatalog3s;
}
}
2、平台属性的保存、查询、修改
@Service
public class AttrServiceImpl implements AttrService {
@Autowired
PmsBaseAttrInfoMapper pmsBaseAttrInfoMapper;
@Autowired
PmsBaseAttrValueMapper pmsBaseAttrValueMapper;
@Autowired
PmsBaseSaleAttrMapper pmsBaseSaleAttrMapper;
/*
*根据三级分类id查询属性列表:
* 首先是通过三级分类id查询属性pmsBaseAttrInfos
*
* 然后对每一个baseAttrInfo更新结果list
* 都是先set一个id,然后select这个id对应的属性
* 然后通过setAttrValueList方法设置对应的属性值
*
* */
@Override
public List<PmsBaseAttrInfo> attrInfoList(String catalog3Id) {
PmsBaseAttrInfo pmsBaseAttrInfo = new PmsBaseAttrInfo();
pmsBaseAttrInfo.setCatalog3Id(catalog3Id);
List<PmsBaseAttrInfo> pmsBaseAttrInfos = pmsBaseAttrInfoMapper.select(pmsBaseAttrInfo);
for (PmsBaseAttrInfo baseAttrInfo : pmsBaseAttrInfos) {
List<PmsBaseAttrValue> pmsBaseAttrValues = new ArrayList<>();
PmsBaseAttrValue pmsBaseAttrValue = new PmsBaseAttrValue();
pmsBaseAttrValue.setAttrId(baseAttrInfo.getId());
pmsBaseAttrValues = pmsBaseAttrValueMapper.select(pmsBaseAttrValue);
baseAttrInfo.setAttrValueList(pmsBaseAttrValues);
}
return pmsBaseAttrInfos;
}
/*保存属性信息
先进行一个判断,使用getId方法查询当前属性的id
如果为空是保存操作,如果非空说明已经存在,是修改操作
保存---
首先将属性保存进数据库,使用通用Mapper的insertSelective方法,将非空的数据加入数据库
属性值是通过pmsBaseAttrInfo查询到一个属性值列表,然后通过foreach依次加入数据库
修改---
修改属性-- 新建一个example对象,然后比较二者的id,然后通用Mapper更新属性信息
修改属性值列表--
同样还是new一个新的对象,设置为当前id,然后删除这个id对应的所有属性值
然后再foreach依次插入
*
* */
@Override
public String saveAttrInfo(PmsBaseAttrInfo pmsBaseAttrInfo) {
String id = pmsBaseAttrInfo.getId();
if(StringUtils.isBlank(id)){//如果id为空,则是保存操作
//保存属性
pmsBaseAttrInfoMapper.insertSelective(pmsBaseAttrInfo);//insertSelective表示是否将null,选择非null加入数据库
//保存属性值
List<PmsBaseAttrValue> attrValueList = pmsBaseAttrInfo.getAttrValueList();
for (PmsBaseAttrValue pmsBaseAttrValue : attrValueList) {
pmsBaseAttrValue.setAttrId(pmsBaseAttrInfo.getId());
pmsBaseAttrValueMapper.insertSelective(pmsBaseAttrValue);
}
}else{//如果id不空,则是修改操作
//修改属性
Example example = new Example(PmsBaseAttrInfo.class);
example.createCriteria().andEqualTo("id", pmsBaseAttrInfo.getId());
pmsBaseAttrInfoMapper.updateByExampleSelective(pmsBaseAttrInfo, example);
//修改属性值
//按照属性id删除所有属性值
PmsBaseAttrValue pmsBaseAttrValueDel = new PmsBaseAttrValue();
pmsBaseAttrValueDel.setAttrId(pmsBaseAttrInfo.getId());//为属性值设置一个id
pmsBaseAttrValueMapper.delete(pmsBaseAttrValueDel);//按照这个id删除所有属性值
//删除后,将新的属性值循环插入
List<PmsBaseAttrValue> attrValueList = pmsBaseAttrInfo.getAttrValueList();
for (PmsBaseAttrValue pmsBaseAttrValue : attrValueList) {
pmsBaseAttrValueMapper.insertSelective(pmsBaseAttrValue);
}
}
return "success";
}
//给定属性id,返回属性值列表。逻辑同之前一样,使用一个映射查询不为空的数据,并封装成一个list返回结果
@Override
public List<PmsBaseAttrValue> getAttrValueList(String attrId) {
PmsBaseAttrValue pmsBaseAttrValue = new PmsBaseAttrValue();
pmsBaseAttrValue.setAttrId(attrId);
List<PmsBaseAttrValue> pmsBaseAttrValues = pmsBaseAttrValueMapper.select(pmsBaseAttrValue);
return pmsBaseAttrValues;
}
//查询平台属性列表 --直接调用通用MapperselectAll方法
@Override
public List<PmsBaseSaleAttr> baseSaleAttrList() {
return pmsBaseSaleAttrMapper.selectAll();
}
3、SPU管理
@Service
public class SpuServiceImpl implements SpuService {
@Autowired
PmsProductInfoMapper pmsProductInfoMapper;
@Autowired
PmsProductImageMapper pmsProductImageMapper;
@Autowired
PmsProductSaleAttrMapper pmsProductSaleAttrMapper;
@Autowired
PmsProductSaleAttrValueMapper pmsProductSaleAttrValueMapper;
/* 根据给定的三级分类ID
通过之前相同的方法进行SpuList的查询
* */
@Override
public List<PmsProductInfo> spuList(String catalog3Id) {
PmsProductInfo pmsProductInfo = new PmsProductInfo();
pmsProductInfo.setCatalog3Id(catalog3Id);
List<PmsProductInfo> pmsProductInfos = pmsProductInfoMapper.select(pmsProductInfo);
return pmsProductInfos;
}
/*
给定pmsProductInfo保存Spu信息
首先通过通用Mapper保存pmsProductInfo进数据库
然后get到商品的id
* */
@Override
public void saveSpuInfo(PmsProductInfo pmsProductInfo) {
// 保存商品信息
pmsProductInfoMapper.insertSelective(pmsProductInfo);
// 生成商品主键
String productId = pmsProductInfo.getId();
// 保存商品图片信息 -- 从给定的信息中get到图片列表,然后依次setid然后插入到数据库--通用Mapper完成
List<PmsProductImage> spuImageList = pmsProductInfo.getSpuImageList();
for (PmsProductImage pmsProductImage : spuImageList) {
pmsProductImage.setProductId(productId);
pmsProductImageMapper.insertSelective(pmsProductImage);
}
// 保存销售属性信息 --从给定信息中get到销售属性列表,分别往数据库中插入属性和属性值 setProductId--insertSelective
List<PmsProductSaleAttr> spuSaleAttrList = pmsProductInfo.getSpuSaleAttrList();
for (PmsProductSaleAttr pmsProductSaleAttr : spuSaleAttrList) {
pmsProductSaleAttr.setProductId(productId);
pmsProductSaleAttrMapper.insertSelective(pmsProductSaleAttr);
// 保存销售属性值
List<PmsProductSaleAttrValue> spuSaleAttrValueList = pmsProductSaleAttr.getSpuSaleAttrValueList();
for (PmsProductSaleAttrValue pmsProductSaleAttrValue : spuSaleAttrValueList) {
pmsProductSaleAttrValue.setProductId(productId);
pmsProductSaleAttrValueMapper.insertSelective(pmsProductSaleAttrValue);
}
}
}
/**
* 这里是获取spu数据库中的图片列表
* 通过给定的spuId,返回id对应的图片
* @param spuId
* @return
*/
@Override
public List<PmsProductImage> spuImageList(String spuId) {
PmsProductImage pmsProductImage = new PmsProductImage();
pmsProductImage.setProductId(spuId);
List<PmsProductImage> pmsProductImages = pmsProductImageMapper.select(pmsProductImage);
return pmsProductImages;
}
/**
* 通过给定的SpuId查询spu销售属性列表
* 首先还是new一个销售属性对象,然后setID给这个对象,然后通过通用mapper查询为这个id的属性列表
*
* 对每一个销售属性查询对应的销售属性值
* 同样先new一个PmsProductSaleAttrValue对象,然后给商品设置给定的id,给销售属性设置为当前属性的id
* 然后select
* 最后setSpuSaleAttrValueList
*
* 返回完成查询之后的销售属性列表
*
* @param spuId
* @return
*/
@Override
public List<PmsProductSaleAttr> spuSaleAttrList(String spuId) {
PmsProductSaleAttr pmsProductSaleAttr = new PmsProductSaleAttr();
pmsProductSaleAttr.setProductId(spuId);
List<PmsProductSaleAttr> PmsProductSaleAttrs = pmsProductSaleAttrMapper.select(pmsProductSaleAttr);
for (PmsProductSaleAttr productSaleAttr : PmsProductSaleAttrs) {
PmsProductSaleAttrValue pmsProductSaleAttrValue = new PmsProductSaleAttrValue();
pmsProductSaleAttrValue.setProductId(spuId);
pmsProductSaleAttrValue.setSaleAttrId(productSaleAttr.getSaleAttrId());// 销售属性id用的是系统的字典表中id,不是销售属性表的主键
List<PmsProductSaleAttrValue> pmsProductSaleAttrValues = pmsProductSaleAttrValueMapper.select(pmsProductSaleAttrValue);
productSaleAttr.setSpuSaleAttrValueList(pmsProductSaleAttrValues);
}
return PmsProductSaleAttrs;
}
}
4、SKU信息插入
@Service
public class SkuServiceImpl implements SkuService {
@Autowired
PmsSkuInfoMapper pmsSkuInfoMapper;
@Autowired
PmsSkuAttrValueMapper pmsSkuAttrValueMapper;
@Autowired
PmsSkuSaleAttrValueMapper pmsSkuSaleAttrValueMapper;
@Autowired
PmsSkuImageMapper pmsSkuImageMapper;
/**
* 在相应的Spu信息这里添加保存Sku信息
* 将skuinfo插入到数据库中
*分别保存平台属性关联--销售属性关联-- sku的图片信息。
*
*
* @param pmsSkuInfo
*/
@Override
public void saveSkuInfo(PmsSkuInfo pmsSkuInfo) {
//插入skuInfo
int i = pmsSkuInfoMapper.insertSelective(pmsSkuInfo); //定义一个i有点奇怪
String skuId = pmsSkuInfo.getId();//这里要get一个skuId
/**
* 下面是同样的插入代码--保存sku信息
* get
* set
* insertSelective
*
*/
//插入平台属性关联
List<PmsSkuAttrValue> pmsSkuAttrValues = pmsSkuInfo.getSkuAttrValueList();
for (PmsSkuAttrValue pmsSkuAttrValue : pmsSkuAttrValues) {
pmsSkuAttrValue.setSkuId(skuId);
pmsSkuAttrValueMapper.insertSelective(pmsSkuAttrValue);
}
//插入销售属性关联
List<PmsSkuSaleAttrValue> skuSaleAttrValueList = pmsSkuInfo.getSkuSaleAttrValueList();
for (PmsSkuSaleAttrValue pmsSkuSaleAttrValue : skuSaleAttrValueList) {
pmsSkuSaleAttrValue.setSkuId(skuId);
pmsSkuSaleAttrValueMapper.insertSelective(pmsSkuSaleAttrValue);
}
//插入图片信息
List<PmsSkuImage> skuImageList = pmsSkuInfo.getSkuImageList();
for (PmsSkuImage pmsSkuImage : skuImageList) {
pmsSkuImage.setSkuId(skuId);
pmsSkuImageMapper.insertSelective(pmsSkuImage);
}
}
}