做網(wǎng)站要會寫代碼嗎百度關(guān)鍵詞搜索怎么弄
在此之前,先來補充一下上一篇文章的一點內(nèi)容:上一篇文章點擊此處詳看
對于畫線的這句話,來詳細(xì)解釋一下吧!
這里面說,對于service服務(wù)層,如果我們所需要實現(xiàn)的業(yè)務(wù)比較簡單的話可以直接在...service接口里面將方法實現(xiàn),而復(fù)雜的業(yè)務(wù)邏輯則需要另外加一個實現(xiàn)類...serviceImpl來實現(xiàn)對應(yīng)的方法。
這里再補充一下:就是我們在后端代碼編寫的時候,Impl實現(xiàn)類并不是必須的,其實它只是起到一個使得我們寫的業(yè)務(wù)邏輯代碼更加清晰,不會使得方法看起來很復(fù)雜。
這里可以舉一個簡單的例子:
比如我們正在開發(fā)一個外賣管理平臺,那么我們肯定需要將要出售的菜品展示給用戶看,我們從平臺管理者的角度看,最簡單的業(yè)務(wù)就是對菜品的增刪查改,而這個增刪查改的邏輯其實都差不多,但它們都是屬于對菜品的管理,四個功能需要四個方法來實現(xiàn),那么我們在編寫代碼時,肯定先在controller控制層先響應(yīng)請求,然后再到服務(wù)層來實現(xiàn)這幾個方法,而在service服務(wù)層,我們?nèi)绻阉膫€方法都寫在...service類里面的話,那就包括(實現(xiàn)方法的邏輯代碼,sql的編寫)對于sql的編寫,若是簡單的sql倒沒什么,如果是比較復(fù)雜的動態(tài)sql,那么全部堆在這個service類里面,下次需要來修改什么功能的話會相當(dāng)難找,還可能影響到其他的功能。而這時候我們就需要再加一個ImplService實現(xiàn)類,在service接口層里面單純地定義方法,再將方法的具體實現(xiàn)代碼編寫到ImplService實現(xiàn)類里面,接著,將復(fù)雜的動態(tài)sql編寫到xml文件里面。這樣,如果我們需要修改哪個方法或sql語句,我們就隨時可以定位到該位置快速修改,不會太冗雜。
當(dāng)然,上面說了,并不是所有的業(yè)務(wù)邏輯都需要Impl實現(xiàn)類,就像上一篇文章里面的新增員工業(yè)務(wù),單純的實現(xiàn)這個功能只需要一句簡單的sql語句,我們就不需要另開一個實現(xiàn)類去實現(xiàn)。
好了,進(jìn)入正題,我們來分析學(xué)習(xí)下面的代碼開放思路!
eg.這是一個關(guān)于刪除的業(yè)務(wù)(刪除套餐)
先對其進(jìn)行需求分析:
業(yè)務(wù)規(guī)則:
可以一次刪除一個套餐,也可以批量刪除套餐
起售中的套餐不能刪除
接口信息:
? ? ? ? Path: /admin/setmeal
? ? ? ? Method: DELETE
接口描述:
? ? ? ? 請求參數(shù):Query
? ? ? ? ? ? ? ? 參數(shù)名稱:ids? ? ? ?必須? ? ? ?
? ? ? ? 返回數(shù)據(jù):
? ? ? ? ? ? ? ? 數(shù)據(jù)名稱:code? ? ? 非必須
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? data? ? ? ?非必須
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? msg? ? ? ?非必須
代碼實現(xiàn):controller—> service—> serviceImpl—> mapper—> (動態(tài)sql--mapper.xml)
SetmealController:
/*** 批量刪除套餐* @param ids* @return */ @DeleteMapping @ApiOperation("批量刪除套餐") public Result delete(@RequestParam List<Long> ids){setmealService.deleteBatch(ids);return Result.success(); }
首先,先編寫Controller層,封裝所需要的數(shù)據(jù),其中ids,我們可以從上面的接口信息知道這是請求參數(shù)且是必須的,所以delete()括號中需要封裝前端提交過來的請求參數(shù),接著就需要一個根據(jù)ids刪除的方法對吧(deleteBatch),我們可以先將其寫出來,然后再到setmealService接口層去創(chuàng)建這個方法。最后返回響應(yīng)結(jié)果。
SetmealService:
/*** 批量刪除套餐* @param ids */ void deleteBatch(List<Long> ids);
SetmealService接口層,這里面單純定義方法給Controller控制層調(diào)用實現(xiàn)刪除功能。
而具體的實現(xiàn)邏輯是在實現(xiàn)類編寫。
SetmealServiceImpl:
/*** 批量刪除套餐* @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 -> {//刪除套餐表中的數(shù)據(jù)setmealMapper.deleteById(setmealId);//刪除套餐菜品關(guān)系表中的數(shù)據(jù)setmealDishMapper.deleteBySetmealId(setmealId);}); }
SetmealServiceImpl就是所需的實現(xiàn)類,在里面編寫刪除方法的具體邏輯,其中,if條件語句是在判斷要刪除的套餐中是否有菜品正在起售,如果有則返回錯誤信息,沒有則刪除套餐中的數(shù)據(jù)和套餐菜品關(guān)系表中的數(shù)據(jù)。當(dāng)然,這里沒有展示套餐表和菜品表。理解其邏輯就行!接著,在這里面,要實現(xiàn)對套餐中菜品信息的遍歷和刪除,需要用到getById()和deteleById()以及deleteBySetmealId()3個方法。它們都將在mapper持久層中實現(xiàn)。
SetmealMapper:
/*** 根據(jù)id查詢套餐* @param id* @return */ @Select("select * from setmeal where id = #{id}") Setmeal getById(Long id);/*** 根據(jù)id刪除套餐* @param setmealId */ @Delete("delete from setmeal where id = #{id}") void deleteById(Long setmealId);
這是對套餐表進(jìn)行查詢和刪除!這里我們可以看到,在方法上面直接進(jìn)行sql的實現(xiàn),這是因為這個業(yè)務(wù)刪除的復(fù)雜度并不高,所以不需要用到動態(tài)sql,如果需要的話,會另外編寫在XML文件中。
SetmealDishMapper:
/*** 根據(jù)套餐id刪除套餐和菜品的關(guān)聯(lián)關(guān)系* @param setmealId */ @Delete("delete from setmeal_dish where setmeal_id = #{setmealId}") void deleteBySetmealId(Long setmealId);
這是對套餐菜品關(guān)系表進(jìn)行數(shù)據(jù)的刪除!
?大概的代碼開發(fā)邏輯就是這樣,意會意會!這也是對上一篇文章所說的業(yè)務(wù)邏輯代碼開放思路的一個具體解釋和舉例!希望對你有幫助!
👍