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