接口9:添加商品
1、首先看给到的参数

这些参数涉及到3个表 分别是:tb_item tb_item_desc tb_item_param_item
所以需要三个表一起操作,==一起完成或者一起失败==
按照理解是需要用三个参数接收参数,分别是 TbItem item 、TbItemDesc itemDesc 、 TbItemParamItem itemParamItem
(这里按照我的理解是,比如说用itemdesc接收,它就只会接收itemDesc,其他的就不管,然后再在后面新添缺少的属性值就可以,所以针对这一群参数,用三个对象就能==全部接收==,而且只接收自己有的属性值)
2、service层
public interface ItemService {
BaizhanResult insertTbItem(TbItem item, TbItemDesc itemDesc, TbItemParamItem itemParamItem);
}
impl层
/**
* 新增商品,本地事务。保证三张表格数据同时新增成功,同时新增失败。
* @param item
* @param itemDesc
* @param itemParamItem
* @return
*/
@Override
@Transactional(rollbackFor = {DaoException.class})
public BaizhanResult insertTbItem(TbItem item, TbItemDesc itemDesc, TbItemParamItem itemParamItem) {
try {
// 完善所有要新增的数据的内容。
Long itemId = IDUtils.genItemId();
Date now = new Date();
// 参数信息缺少 id 状态status 创建时间 更新时间
item.setId(itemId);
item.setStatus(1); // 数据库中表格数据的状态字段。 1-正常;2-下架;3-删除
item.setCreated(now);
item.setUpdated(now);
// 参数信息缺少 itemid 创建时间 更新时间
itemDesc.setItemId(itemId);
itemDesc.setCreated(now);
itemDesc.setUpdated(now);
// 参数信息缺少 id itemid 创建时间 更新时间
itemParamItem.setId(IDUtils.genItemId());
itemParamItem.setItemId(itemId);
itemParamItem.setCreated(now);
itemParamItem.setUpdated(now);
// 新增数据到数据库、
// 新增商品
int rows = itemMapper.insert(item);
if (rows != 1) {
throw new DaoException("新增商品 - 新增商品到数据库错误");
}
rows = itemDescMapper.insert(itemDesc);
if (rows != 1) {
throw new DaoException("新增商品 - 新增商品详情到数据库错误");
}
rows = itemParamItemMapper.insert(itemParamItem);
if (rows != 1) {
throw new DaoException("新增商品 - 新增商品规格到数据库错误");
}
// 只有三个都成功才成功
return BaizhanResult.ok();
}catch (DaoException e){
// 手工抛出的异常
throw e;
}catch (Exception e){
throw new DaoException("新增商品时发生错误:" + e.getMessage(), e);
}
}
注意:1、由于自定义异常是运行时异常,不需要写rollbackfor 如果是受检异常(继承Exception),必须写rollbackfor=“java.lang.Exception”
2、前面注入三个表的mapper层,用于操作三个表
@Autowired
private TbItemMapper itemMapper;
@Autowired
private TbItemDescMapper itemDescMapper;
@Autowired
private TbItemParamItemMapper itemParamItemMapper;
控制层
/**
* 新增商品
* @param item 商品基本信息 tb_item
* @param itemDesc 商品详情信息,图文介绍 tb_item_desc
* @param itemParamItem 商品规格数据, tb_item_param_item
* @return
*/
@PostMapping("/backend/item/insertTbItem")
public BaizhanResult insertTbItem(TbItem item, TbItemDesc itemDesc,
TbItemParamItem itemParamItem){
try {
log.info("新增商品到数据库");
return itemService.insertTbItem(item, itemDesc, itemParamItem);
}catch (Exception e){
log.error(e.getMessage());
return BaizhanResult.error("服务器忙,请稍后重试");
}
}
接口10:删除商品
删除商品就是更改一下状态 status=3,以及更新 更新时间updatetime,用的是itemMapper.updateById
impl层
/**
* 根据主键删除商品。标记删除。修改状态status=3
* @param id
* @return
*/
@Override
@Transactional(rollbackFor = {DaoException.class})
public BaizhanResult deleteItemById(Long id) {
try {
TbItem item = itemMapper.selectById(id);
// 设置要更新的数据
item.setStatus(3); // 删除状态
item.setUpdated(new Date()); // 更新时间
int rows = itemMapper.updateById(item);
if (rows != 1) {
throw new DaoException("删除商品失败,id=" + id);
}
return BaizhanResult.ok();
}catch (DaoException e){
throw e;
}catch (Exception e){
throw new DaoException("删除商品错误," + e.getMessage(), e);
}
}
控制层
/**
* 根据主键删除商品
* @param id
* @return
*/
@PostMapping("/backend/item/deleteItemById")
public BaizhanResult deleteItemById(Long id){
try {
log.info("删除商品:" + id);
return itemService.deleteItemById(id);
}catch (Exception e){
log.error(e.getMessage());
return BaizhanResult.error("服务器忙,请稍后重试");
}
}
注意:1、同样的,impl层接收参数也可以用item对象接
接口11:上架商品
更改状态
用id
impl层
/**
* 商品上架,修改状态status=1
* @param id
* @return
*/
@Override
public BaizhanResult onshelfItemById(Long id) {
try {
TbItem item = itemMapper.selectById(id);
// 设置要更新的数据
item.setStatus(1); // 上架状态
item.setUpdated(new Date()); // 更新时间
int rows = itemMapper.updateById(item);
if (rows != 1) {
throw new DaoException("上架商品失败,id=" + id);
}
return BaizhanResult.ok();
}catch (DaoException e){
throw e;
}catch (Exception e){
throw new DaoException("上架商品错误," + e.getMessage(), e);
}
}
控制层
/**
* 商品上架
* @param id 要上架的商品主键
* @return
*/
@PostMapping("/backend/item/onshelfItemById")
public BaizhanResult onshelfItemById(Long id){
try{
log.info("商品上架,id = " + id);
return itemService.onshelfItemById(id);
}catch (Exception e){
log.error(e.getMessage());
return BaizhanResult.error("服务器忙,请稍后重试");
}
}
用对象接
impl层
/**
* 商品上架,修改状态status=1
* @param tbItem
* @return
*/
@Override
public BaizhanResult onshelfItemById(TbItem tbItem) {
try {
// TbItem item = itemMapper.selectById(id);
// 设置要更新的数据
tbItem.setStatus(1); // 上架状态
tbItem.setUpdated(new Date()); // 更新时间
int rows = itemMapper.updateById(tbItem);
if (rows != 1) {
throw new DaoException("上架商品失败");
}
return BaizhanResult.ok();
}catch (DaoException e){
throw e;
}catch (Exception e){
throw new DaoException("上架商品错误," + e.getMessage(), e);
}
}
接口12:下架商品
impl层
@Override
public BaizhanResult offshelfItemById(Long id) {
try {
TbItem item = itemMapper.selectById(id);
// 设置要更新的数据
item.setStatus(2); // 下架状态
item.setUpdated(new Date()); // 更新时间
int rows = itemMapper.updateById(item);
if (rows != 1) {
throw new DaoException("下架商品失败,id=" + id);
}
return BaizhanResult.ok();
}catch (DaoException e){
throw e;
}catch (Exception e){
throw new DaoException("下架商品错误," + e.getMessage(), e);
}
}
控制层
/**
* 商品下架
* @param id 要下架的商品主键
* @return
*/
@PostMapping("/backend/item/offshelfItemById")
public BaizhanResult offshelfItemById(Long id){
try{
log.info("商品下架, id = " + id);
return itemService.offshelfItemById(id);
}catch (Exception e){
log.error(e.getMessage());
return BaizhanResult.error("服务器忙,请稍后重试");
}
}
接口13:预更新商品
参数是 id,返回数据需要4个对象值
我的想法是:注入4个mapper,然后依次查item(判断是否存在)、itemcat、itemdesc、itemparmitem,最后返回键值对,键为名称,值为对象即可
需要注意的是返回map的时候,键名称一定要和接口文档中key相同,不能乱写,便于前端拿到数据进行映射
注入mapper
@Autowired
private TbItemMapper itemMapper;
@Autowired
private TbItemDescMapper itemDescMapper;
@Autowired
private TbItemParamItemMapper itemParamItemMapper;
@Autowired
private TbItemCatMapper itemCatMapper;
impl层
/**
* 预更新商品
* @param id 要更新的商品主键
* @return
*/
@Override
public BaizhanResult preUpdateItem(Long id) {
try {
// 查询商品
TbItem item = itemMapper.selectById(id);
// 查询商品类型
if (item == null) {
throw new DaoException("预更新商品错误, 查询商品失败, id = " + id);
}
TbItemCat itemCat = itemCatMapper.selectById(item.getCid());
// 查询商品详情
TbItemDesc itemDesc = itemDescMapper.selectById(item.getId());
// 查询商品规格
QueryWrapper<TbItemParamItem> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("item_id", item.getId());
TbItemParamItem itemParamItem = itemParamItemMapper.selectOne(queryWrapper);
// 处理返回结果
Map<String, Object> result = new HashMap<>();
result.put("itemCat", itemCat);
result.put("item", item);
result.put("itemDesc", itemDesc);
result.put("itemParamItem", itemParamItem);
return BaizhanResult.ok(result);
}catch (DaoException e){
throw e;
}catch (Exception e){
throw new DaoException("预更新商品错误:" + e.getMessage(), e);
}
}
控制层
/**
* 预更新处理,根据商品主键,查询商品相关数据。
* @param id
* @return
*/
@PostMapping("/backend/item/preUpdateItem")
public BaizhanResult preUpdateItem(Long id){
try {
log.info("预更新商品,id = " + id);
return itemService.preUpdateItem(id);
}catch (Exception e){
log.error(e.getMessage());
return BaizhanResult.error("服务器忙,请稍后重试");
}
}
接口14:修改(更新)商品信息
根据参数可知:需要操作三个表,所以用到三个mapper
@Autowired
private TbItemMapper itemMapper;
@Autowired
private TbItemDescMapper itemDescMapper;
@Autowired
private TbItemParamItemMapper itemParamItemMapper;
impl层
/**
* 更新商品
* @param item
* @param itemDesc
* @param itemParamItem
* @return
*/
@Override
@Transactional(rollbackFor = {DaoException.class})
public BaizhanResult updateTbItem(TbItem item, TbItemDesc itemDesc, TbItemParamItem itemParamItem) {
try {
// 完善要更新的商品的数据
Date now = new Date(); // 当前时间,即更新时间。
item.setUpdated(now);
itemDesc.setItemId(item.getId()); // 商品主键即商品详情主键
itemDesc.setUpdated(now); // 更新时间
itemParamItem.setUpdated(now);
itemParamItem.setItemId(item.getId());
// 更新商品
int rows = itemMapper.updateById(item);
if (rows != 1) {
throw new DaoException("更新商品 - 更新商品到数据库错误");
}
// 更新商品详情
rows = itemDescMapper.updateById(itemDesc);
if (rows != 1) {
throw new DaoException("更新商品 - 更新商品详情到数据库错误");
}
// 更新商品规格,条件更新。当商品主键等于要更新的商品主键时,更新商品规格
QueryWrapper<TbItemParamItem> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("item_id", item.getId());
// 第一个参数是修改后的对象,第二个参数是修改的条件
rows = itemParamItemMapper.update(itemParamItem, queryWrapper);
if (rows != 1) {
throw new DaoException("更新商品 - 更新商品规格到数据库错误");
}
return BaizhanResult.ok();
}catch (DaoException e){
throw e;
}catch (Exception e){
throw new DaoException("更新商品错误, " + e.getMessage(), e);
}
}
控制层
/**
* 更新商品
* mybatis-plus更新数据的时候,回判断,要更新的数据的属性是否是null或'0'.
* 如果是,则忽略此字段的更新。如果不是,则更新字段新数据。
* @param item 商品基本数据
* @param itemDesc 商品详情
* @param itemParamItem 商品规格
* @return
*/
@PostMapping("/backend/item/updateTbItem")
public BaizhanResult updateTbItem(TbItem item, TbItemDesc itemDesc,
TbItemParamItem itemParamItem){
try {
log.info("更新商品,id = " + item.getId());
return itemService.updateTbItem(item, itemDesc, itemParamItem);
}catch (Exception e){
log.error(e.getMessage());
return BaizhanResult.error("服务器忙,请稍后重试");
}
}
注意:1、所有 ==根据id== 进行查询、更新、删除操作时,都需要判断是否存在数据
2、itemParamItemMapper.update() 第一个参数是修改后的对象,第二个参数是修改的条件
3、搞清楚接收对象 ==已填充和待填充的属性==