@Transactional //一个业务中包含多个增删改操作,所以要添加事务 @Override public void delete(List<Long> ids) { for (Long id : ids) { Dish dish = dishMapper.getById(id); if (dish.getStatus() == StatusConstant.ENABLE) { //判断如果菜品在起售中,那么就不能删除 throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE); } } //删除菜表中的数据 List<Long> setmealIds = setmealDishMapper.getSetmealIdsByDishIds(ids); if (setmealIds != null && setmealIds.size() > 0) { //当前菜品被套餐关联了,不能删除 throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL); } for (Long id : ids) { dishMapper.deleteById(id);//后绪步骤实现 //删除菜品关联的口味数据 dishFlavorMapper.deleteByDishId(id);//后绪步骤实现 } }
时间: 2023-12-06 17:41:34 浏览: 95
这代码是一个菜品删除的业务逻辑,使用了事务注解 @Transactional 来保证多个操作的原子性。首先,它遍历了传入的菜品 id 列表,检查每个菜品是否处于起售状态,如果是则抛出 DeletionNotAllowedException 异常,表示不允许删除。接着,它查询该菜品是否被任何套餐关联,如果是则同样抛出 DeletionNotAllowedException 异常。最后,它遍历菜品 id 列表,依次删除菜品信息和与该菜品关联的口味数据。
相关问题
@Service @Transactional public class OrderServiceImpl implements OrderService { @Autowired private OrderDao orderDao; @Override public boolean saveOrder(Order order) { return orderDao.insert(order)>0; } @Override public List<Order> getByUserId(Long userId) { return orderDao.selectUserId(userId); } }
这是一个订单服务的实现类,实现了订单相关的业务方法。具体来说,该类使用了 @Service 注解将它标识为一个 Spring 服务,使用了 @Transactional 注解开启了事务管理。
在类中,使用了 @Autowired 注解自动注入了 OrderDao 对象,用于操作订单表。该注解可以帮助开发者简化对象的创建和管理,提高了代码的可维护性。
同时,该类实现了 OrderService 接口中定义的两个方法,包括:
- saveOrder(Order order):保存订单信息,返回一个 boolean 类型的结果,表示操作是否成功。在方法中,调用了 OrderDao 对象的 insert 方法,插入订单信息到数据库中。
- getByUserId(Long userId):根据用户 ID 查询订单信息,返回一个 Order 对象的列表。在方法中,调用了 OrderDao 对象的 selectUserId 方法,查询指定用户 ID 的所有订单信息。
通过这些方法,可以很方便地实现订单的保存和查询等操作,同时使用了事务管理来保证数据的一致性。
优化代码:/** * 批量删除仪器 * * @param ids 需要删除的仪器主键 * @return 结果 */ @Override @Transactional public int deleteGsApparatusByIds(Long[] ids) { List<GsApparatusExample> list = gsApparatusExampleMapper.selectByApparatusIds(ids); if (!CollectionUtils.isEmpty(list)) { gsApparatusExampleMapper.deleteBatchIds(list); } List<GsApparatusIndex> listIndex = gsApparatusIndexMapper.selectByApparatusIds(ids); if (!CollectionUtils.isEmpty(listIndex)) { for (GsApparatusIndex index : listIndex) { Long id = index.getId(); gsArticleMapper.deleteGsArticleByIndexId(id); } gsApparatusIndexMapper.deleteBatchIds(listIndex); } return gsApparatusMapper.deleteGsApparatusByIds(ids); }
这段代码中可以进行一些优化的地方如下:
1. 使用批量删除方法:可以将删除操作改为使用批量删除的方式,这样可以减少与数据库的交互次数,提高效率。可以使用`gsApparatusMapper.deleteBatchIds(ids)`方法来实现批量删除。
2. 合并多个查询:在删除仪器之前,代码中进行了多次查询操作。可以将这些查询合并为一个查询,以减少数据库查询次数。可以使用`IN`语句来查询多个id对应的记录。
优化后的代码如下所示:
```java
@Override
@Transactional
public int deleteGsApparatusByIds(Long[] ids) {
if (ids.length == 0) {
return 0;
}
// 批量删除仪器
gsApparatusMapper.deleteBatchIds(Arrays.asList(ids));
// 查询需要删除的索引
List<GsApparatusIndex> listIndex = gsApparatusIndexMapper.selectByApparatusIds(ids);
if (!CollectionUtils.isEmpty(listIndex)) {
// 删除索引对应的文章
List<Long> indexIds = listIndex.stream().map(GsApparatusIndex::getId).collect(Collectors.toList());
gsArticleMapper.deleteBatchIds(indexIds);
// 批量删除索引
gsApparatusIndexMapper.deleteBatchIds(listIndex);
}
return ids.length;
}
```
这样做的好处是减少了与数据库的交互次数,并且通过批量操作可以提高代码的执行效率。
阅读全文