在此之前,先来补充一下上一篇文章的一点内容:上一篇文章点击此处详看
对于画线的这句话,来详细解释一下吧!
这里面说,对于service服务层,如果我们所需要实现的业务比较简单的话可以直接在...service接口里面将方法实现,而复杂的业务逻辑则需要另外加一个实现类...serviceImpl来实现对应的方法。
这里再补充一下:就是我们在后端代码编写的时候,Impl实现类并不是必须的,其实它只是起到一个使得我们写的业务逻辑代码更加清晰,不会使得方法看起来很复杂。
这里可以举一个简单的例子:
比如我们正在开发一个外卖管理平台,那么我们肯定需要将要出售的菜品展示给用户看,我们从平台管理者的角度看,最简单的业务就是对菜品的增删查改,而这个增删查改的逻辑其实都差不多,但它们都是属于对菜品的管理,四个功能需要四个方法来实现,那么我们在编写代码时,肯定先在controller控制层先响应请求,然后再到服务层来实现这几个方法,而在service服务层,我们如果要把四个方法都写在...service类里面的话,那就包括(实现方法的逻辑代码,sql的编写)对于sql的编写,若是简单的sql倒没什么,如果是比较复杂的动态sql,那么全部堆在这个service类里面,下次需要来修改什么功能的话会相当难找,还可能影响到其他的功能。而这时候我们就需要再加一个ImplService实现类,在service接口层里面单纯地定义方法,再将方法的具体实现代码编写到ImplService实现类里面,接着,将复杂的动态sql编写到xml文件里面。这样,如果我们需要修改哪个方法或sql语句,我们就随时可以定位到该位置快速修改,不会太冗杂。
当然,上面说了,并不是所有的业务逻辑都需要Impl实现类,就像上一篇文章里面的新增员工业务,单纯的实现这个功能只需要一句简单的sql语句,我们就不需要另开一个实现类去实现。
好了,进入正题,我们来分析学习下面的代码开放思路!
eg.这是一个关于删除的业务(删除套餐)
先对其进行需求分析:
业务规则:
可以一次删除一个套餐,也可以批量删除套餐
起售中的套餐不能删除
接口信息:
Path: /admin/setmeal
Method: DELETE
接口描述:
请求参数:Query
参数名称:ids 必须
返回数据:
数据名称:code 非必须
data 非必须
msg 非必须
**代码实现:**controller---> service---> serviceImpl---> mapper---> (动态sql--mapper.xml)
SetmealController:
java/** * 批量删除套餐 * @param ids * @return */ @DeleteMapping @ApiOperation("批量删除套餐") public Result delete(@RequestParam List<Long> ids){ setmealService.deleteBatch(ids); return Result.success(); }
首先,先编写Controller层,封装所需要的数据,其中ids,我们可以从上面的接口信息知道这是请求参数且是必须的,所以delete()括号中需要封装前端提交过来的请求参数,接着就需要一个根据ids删除的方法对吧(deleteBatch),我们可以先将其写出来,然后再到setmealService接口层去创建这个方法。最后返回响应结果。
SetmealService:
java/** * 批量删除套餐 * @param ids */ void deleteBatch(List<Long> ids);
SetmealService接口层,这里面单纯定义方法给Controller控制层调用实现删除功能。
而具体的实现逻辑是在实现类编写。
SetmealServiceImpl:
java/** * 批量删除套餐 * @param ids */ @Transactional public void deleteBatch(List<Long> ids) { ids.forEach(id -> { Setmeal setmeal = setmealMapper.getById(id); if(StatusConstant.ENABLE == setmeal.getStatus()){ //起售中的套餐不能删除 throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE); } }); ids.forEach(setmealId -> { //删除套餐表中的数据 setmealMapper.deleteById(setmealId); //删除套餐菜品关系表中的数据 setmealDishMapper.deleteBySetmealId(setmealId); }); }
SetmealServiceImpl就是所需的实现类,在里面编写删除方法的具体逻辑,其中,if条件语句是在判断要删除的套餐中是否有菜品正在起售,如果有则返回错误信息,没有则删除套餐中的数据和套餐菜品关系表中的数据。当然,这里没有展示套餐表和菜品表。理解其逻辑就行!接着,在这里面,要实现对套餐中菜品信息的遍历和删除,需要用到getById()和deteleById()以及deleteBySetmealId()3个方法。它们都将在mapper持久层中实现。
SetmealMapper:
java/** * 根据id查询套餐 * @param id * @return */ @Select("select * from setmeal where id = #{id}") Setmeal getById(Long id); /** * 根据id删除套餐 * @param setmealId */ @Delete("delete from setmeal where id = #{id}") void deleteById(Long setmealId);
这是对套餐表进行查询和删除!这里我们可以看到,在方法上面直接进行sql的实现,这是因为这个业务删除的复杂度并不高,所以不需要用到动态sql,如果需要的话,会另外编写在XML文件中。
SetmealDishMapper:
java/** * 根据套餐id删除套餐和菜品的关联关系 * @param setmealId */ @Delete("delete from setmeal_dish where setmeal_id = #{setmealId}") void deleteBySetmealId(Long setmealId);
这是对套餐菜品关系表进行数据的删除!
大概的代码开发逻辑就是这样,意会意会!这也是对上一篇文章所说的业务逻辑代码开放思路的一个具体解释和举例!希望对你有帮助!
👍