SpringBoot電腦商城項目刪除收貨地址的實現(xiàn)方法
1.持久層[Mapper]
1規(guī)劃需要執(zhí)行的SQL語句
1.在刪除之前判斷該數(shù)據(jù)是否存在,需要執(zhí)行查詢語句看能否查到該數(shù)據(jù),還需要根據(jù)返回的aid獲取uid并和session中的uid進行比較判斷歸屬是否正確,這一條SQL語句在設(shè)置收貨地址時已經(jīng)開發(fā),無需重復(fù)開發(fā)
2.開發(fā)執(zhí)行刪除的SQL語句
delete from t_address where aid=?
3.需要判斷刪除的地址是否是默認地址(使用aid查詢到的地址對象的getIsDefault方法),如果判斷出刪的是默認地址,則還需要定義把哪個地址設(shè)為默認,這里定義最新修改的為默認地址.
開發(fā)該SQL語句
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),這樣查詢后就只會獲得第一條數(shù)據(jù)
4.如果用戶本身就只有一條地址,那么刪除后其他操作就可以不進行了,所以需要查詢該用戶的所有地址數(shù)量,在設(shè)置收貨地址時已經(jīng)開發(fā),無需重復(fù)開發(fā)
2 設(shè)計接口和抽象方法
在AddressMapper接口中進行抽象方法的設(shè)計
/** * 根據(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文件中進行映射
<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單元測試
@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ù)歸屬錯誤(已開發(fā))
- 在執(zhí)行刪除的時候可能會產(chǎn)生未知的異常導(dǎo)致數(shù)據(jù)不能夠刪除成功,則拋出DeleteException異常,在service創(chuàng)建該異常并使其繼承業(yè)務(wù)層異常
/**刪除數(shù)據(jù)時產(chǎn)生的異常*/ public class DeleteException extends ServiceException{ /**重寫ServiceException的所有構(gòu)造方法*/ }
2設(shè)計接口和抽象方法及實現(xiàn)
1.在IAddressService接口中定義抽象方法
需要給抽象方法聲明哪些參數(shù)呢:
根據(jù)分析可得,該抽象方法的實現(xiàn)依賴于持久層的以下方法:
1.findByAid:查詢該條地址數(shù)據(jù)是否存在,參數(shù)是aid
3.deleteByAid:刪除地址數(shù)據(jù),參數(shù)是aid
5.countByUid:統(tǒng)計用戶地址數(shù)量,參數(shù)是uid
6.findLastModified:查詢得到最后修改的一條地址,參數(shù)是uid
7.updateDefaultByAid:設(shè)置默認收貨地址,參數(shù)是aid,modifiedUser,modifiedTime
稍加分析可以得出接下來定義的抽象方法的參數(shù)是:aid,uid,username
把上面的分析補上:2.判斷地址數(shù)據(jù)歸屬是否正確4.判斷刪除的是否是默認地址.這七步就是業(yè)務(wù)層完整的開發(fā)流程
/** * 刪除用戶選中的收貨地址數(shù)據(jù) * @param aid 收貨地址id * @param uid 用戶id * @param username 用戶名 */ void delete(Integer aid,Integer uid,String username);
2.實現(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ù)時產(chǎn)生未知的異常"); } //4.如果刪除的是非默認地址則不需要再做后面的任何操作,終止程序 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ù)時產(chǎn)生未知的異常"); } }
3單元測試
@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ù)時產(chǎn)生未知的異常"); }
2設(shè)計請求
- /addresses/{aid}/delete
- POST
- Integer aid,HttpSession session
- JsonResult<Void>
3處理請求
@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單元測試
在AddressController類編寫請求處理方法的實現(xiàn)
這個方法就只是調(diào)用業(yè)務(wù)層方法然后給前端返回一些信息,可以選擇不用測試
4.前端頁面
處理該前端頁面的所有步驟和處理"設(shè)置默認收貨地址"的一樣
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.給占位符賦值
因為處理"設(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) { //重新加載收貨地址列表頁面 showAddressList(); } else { alert("刪除收貨地址失敗") } }, error: function (xhr) { alert("刪除收貨地址時產(chǎn)生未知的異常!"+xhr.message); } }); }
到此這篇關(guān)于SpringBoot項目--電腦商城刪除收貨地址的文章就介紹到這了,更多相關(guān)SpringBoot刪除收貨地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
maven依賴關(guān)系中的<scope>provided</scope>使用詳解
這篇文章主要介紹了maven依賴關(guān)系中的<scope>provided</scope>使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07intelliJ idea 2023 配置Tomcat 8圖文教程
這篇文章主要介紹了intelliJ idea 2023 配置Tomcat 8教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06Java中ThreadLocal避免內(nèi)存泄漏的方法詳解
ThreadLocal是Java中的一個線程本地存儲機制,它允許每個線程擁有一個獨立的本地存儲空間,用于存儲該線程的變量,本文主要介紹了ThreadLocal如何避免內(nèi)存泄漏,需要的朋友可以參考下2023-05-05JAVA8 STREAM COLLECT GROUPBY分組實例解析
這篇文章主要介紹了JAVA8 STREAM COLLECT GROUPBY分組實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01springboot整合mqtt實現(xiàn)消息訂閱和推送功能
mica-mqtt-client-spring-boot-starter是一個方便、高效、可靠的MQTT客戶端啟動器,適用于需要使用MQTT協(xié)議進行消息通信的Spring Boot應(yīng)用程序,這篇文章主要介紹了springboot整合mqtt實現(xiàn)消息訂閱和推送功能,需要的朋友可以參考下2024-02-02