SpringBoot電腦商城項(xiàng)目刪除收貨地址的實(shí)現(xiàn)方法
1.持久層[Mapper]
1規(guī)劃需要執(zhí)行的SQL語(yǔ)句
1.在刪除之前判斷該數(shù)據(jù)是否存在,需要執(zhí)行查詢語(yǔ)句看能否查到該數(shù)據(jù),還需要根據(jù)返回的aid獲取uid并和session中的uid進(jìn)行比較判斷歸屬是否正確,這一條SQL語(yǔ)句在設(shè)置收貨地址時(shí)已經(jīng)開發(fā),無需重復(fù)開發(fā)
2.開發(fā)執(zhí)行刪除的SQL語(yǔ)句
delete from t_address where aid=?
3.需要判斷刪除的地址是否是默認(rèn)地址(使用aid查詢到的地址對(duì)象的getIsDefault方法),如果判斷出刪的是默認(rèn)地址,則還需要定義把哪個(gè)地址設(shè)為默認(rèn),這里定義最新修改的為默認(rèn)地址.
開發(fā)該SQL語(yǔ)句
select * from t_address where uid=? order by modified_time DESC limit 0,1
其中l(wèi)imit 0,1表示查詢到的第一條數(shù)據(jù)(limit (n-1),pageSize),這樣查詢后就只會(huì)獲得第一條數(shù)據(jù)
4.如果用戶本身就只有一條地址,那么刪除后其他操作就可以不進(jìn)行了,所以需要查詢?cè)撚脩舻乃械刂窋?shù)量,在設(shè)置收貨地址時(shí)已經(jīng)開發(fā),無需重復(fù)開發(fā)
2 設(shè)計(jì)接口和抽象方法
在AddressMapper接口中進(jìn)行抽象方法的設(shè)計(jì)
/** * 根據(jù)收貨地址id刪除收貨地址數(shù)據(jù) * @param aid 收貨地址的id * @return 受影響的行數(shù) */Integer deleteByAid(Integer aid);/** * 根據(jù)用戶uid查詢用戶最后一次被修改的收貨地址數(shù)據(jù) * @param uid 用戶id * @return 收貨地址數(shù)據(jù) */Address findLastModified(Integer uid);
3編寫映射
在AddressMapper.xml文件中進(jìn)行映射
<delete id="deleteByAid"> delete from t_address where aid=#{aid} </delete> <select id="findLastModified" resultMap="AddressEntityMap"> select * from t_address where uid=#{uid} order by modified_time DESC limit 0,1 </select>
4單元測(cè)試
@Test public void deleteByAid() { addressMapper.deleteByAid(11); } @Test public void findLastModified() { System.out.println(addressMapper.findLastModified(11)); } }
2.業(yè)務(wù)層[Service]
1規(guī)劃異常
- 可能沒有該條地址數(shù)據(jù)(已開發(fā))
- 可能地址數(shù)據(jù)歸屬錯(cuò)誤(已開發(fā))
- 在執(zhí)行刪除的時(shí)候可能會(huì)產(chǎn)生未知的異常導(dǎo)致數(shù)據(jù)不能夠刪除成功,則拋出DeleteException異常,在service創(chuàng)建該異常并使其繼承業(yè)務(wù)層異常
/**刪除數(shù)據(jù)時(shí)產(chǎn)生的異常*/ public class DeleteException extends ServiceException{ /**重寫ServiceException的所有構(gòu)造方法*/ }
2設(shè)計(jì)接口和抽象方法及實(shí)現(xiàn)
1.在IAddressService接口中定義抽象方法
需要給抽象方法聲明哪些參數(shù)呢:
根據(jù)分析可得,該抽象方法的實(shí)現(xiàn)依賴于持久層的以下方法:
1.findByAid:查詢?cè)摋l地址數(shù)據(jù)是否存在,參數(shù)是aid
3.deleteByAid:刪除地址數(shù)據(jù),參數(shù)是aid
5.countByUid:統(tǒng)計(jì)用戶地址數(shù)量,參數(shù)是uid
6.findLastModified:查詢得到最后修改的一條地址,參數(shù)是uid
7.updateDefaultByAid:設(shè)置默認(rèn)收貨地址,參數(shù)是aid,modifiedUser,modifiedTime
稍加分析可以得出接下來定義的抽象方法的參數(shù)是:aid,uid,username
把上面的分析補(bǔ)上:2.判斷地址數(shù)據(jù)歸屬是否正確4.判斷刪除的是否是默認(rèn)地址.這七步就是業(yè)務(wù)層完整的開發(fā)流程
/** * 刪除用戶選中的收貨地址數(shù)據(jù) * @param aid 收貨地址id * @param uid 用戶id * @param username 用戶名 */ void delete(Integer aid,Integer uid,String username);
2.實(shí)現(xiàn)該抽象方法
@Override public void delete(Integer aid, Integer uid, String username) { Address result = addressMapper.findByAid(aid); //1. if (result == null) { throw new AddressNotFoundException("收貨地址數(shù)據(jù)不存在"); } //2. if (!result.getUid().equals(uid)) { throw new AccessDeniedException("非法數(shù)據(jù)訪問"); } //3. Integer rows = addressMapper.deleteByAid(aid); if (rows != 1) { throw new DeleteException("刪除數(shù)據(jù)時(shí)產(chǎn)生未知的異常"); } //4.如果刪除的是非默認(rèn)地址則不需要再做后面的任何操作,終止程序 if (result.getIsDefault() == 0) { return; } //5. Integer count = addressMapper.countByUid(uid); if (count == 0) { return; } //6. Address address = addressMapper.findLastModified(uid); //7. rows = addressMapper.updateDefaultByAid(address.getAid(), username, new Date()); if (rows != 1) { throw new UpdateException("更新數(shù)據(jù)時(shí)產(chǎn)生未知的異常"); } }
3單元測(cè)試
@Test public void delete() { addressService.delete(1,11,"4.11刪除"); }
3.控制層[Controller]
1處理異常
需要在BaseController類中處理異常類
else if (e instanceof DeleteException) { result.setState(5002); result.setMessage("刪除數(shù)據(jù)時(shí)產(chǎn)生未知的異常"); }
2設(shè)計(jì)請(qǐng)求
- /addresses/{aid}/delete
- POST
- Integer aid,HttpSession session
- JsonResult<Void>
3處理請(qǐng)求
@RequestMapping("{aid}/delete") public JsonResult<Void> delete(@PathVariable("aid") Integer aid,HttpSession session) { addressService.delete( aid, getUidFromSession(session), getUsernameFromSession(session)); return new JsonResult<>(OK); }
4單元測(cè)試
在AddressController類編寫請(qǐng)求處理方法的實(shí)現(xiàn)
這個(gè)方法就只是調(diào)用業(yè)務(wù)層方法然后給前端返回一些信息,可以選擇不用測(cè)試
4.前端頁(yè)面
處理該前端頁(yè)面的所有步驟和處理"設(shè)置默認(rèn)收貨地址"的一樣
1.給"刪除"按鈕添加onclick屬性并指向deleteByAid(aid)方法
<td><a onclick="delete(#{aid})" class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 刪除</a></td>
2.給占位符賦值
因?yàn)樘幚?quot;設(shè)置默認(rèn)收貨地址"時(shí)已經(jīng)編寫tr = tr.replace(“#{aid}”,list[i].aid);用來給占位符#{aid}賦值,所以這里不需要再寫.但是需要把replace改為replaceAll
3.完成deleteByAid(aid)方法的聲明
function setDefault(aid) { $.ajax({ url: "/addresses/"+aid+"/set_default", type: "POST", //data: $("#form-change-password").serialize(), dataType: "JSON", success: function (json) { if (json.state == 200) { //重新加載收貨地址列表頁(yè)面 showAddressList(); } else { alert("刪除收貨地址失敗") } }, error: function (xhr) { alert("刪除收貨地址時(shí)產(chǎn)生未知的異常!"+xhr.message); } }); }
到此這篇關(guān)于SpringBoot項(xiàng)目--電腦商城刪除收貨地址的文章就介紹到這了,更多相關(guān)SpringBoot刪除收貨地址內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
maven依賴關(guān)系中的<scope>provided</scope>使用詳解
這篇文章主要介紹了maven依賴關(guān)系中的<scope>provided</scope>使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07intelliJ idea 2023 配置Tomcat 8圖文教程
這篇文章主要介紹了intelliJ idea 2023 配置Tomcat 8教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Java中ThreadLocal避免內(nèi)存泄漏的方法詳解
ThreadLocal是Java中的一個(gè)線程本地存儲(chǔ)機(jī)制,它允許每個(gè)線程擁有一個(gè)獨(dú)立的本地存儲(chǔ)空間,用于存儲(chǔ)該線程的變量,本文主要介紹了ThreadLocal如何避免內(nèi)存泄漏,需要的朋友可以參考下2023-05-05JAVA8 STREAM COLLECT GROUPBY分組實(shí)例解析
這篇文章主要介紹了JAVA8 STREAM COLLECT GROUPBY分組實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01springboot整合mqtt實(shí)現(xiàn)消息訂閱和推送功能
mica-mqtt-client-spring-boot-starter是一個(gè)方便、高效、可靠的MQTT客戶端啟動(dòng)器,適用于需要使用MQTT協(xié)議進(jìn)行消息通信的Spring Boot應(yīng)用程序,這篇文章主要介紹了springboot整合mqtt實(shí)現(xiàn)消息訂閱和推送功能,需要的朋友可以參考下2024-02-02SpringBoot實(shí)現(xiàn)自定義事件的方法詳解
這篇文章將用實(shí)例來和大家介紹一下如何在SpringBoot中自定義事件來使用觀察者模式。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)SpringBoot有一定的幫助,需要的可以參考一下2022-06-06