SpringBoot實戰:多表聯查

1. 保存和更新公寓信息

請求數據的結構?

@Schema(description = "公寓信息")
@Data
public class ApartmentSubmitVo extends ApartmentInfo {@Schema(description="公寓配套id")private List<Long> facilityInfoIds;@Schema(description="公寓標簽id")private List<Long> labelIds;@Schema(description="公寓雜費值id")private List<Long> feeValueIds;@Schema(description="公寓圖片id")private List<GraphVo> graphVoList;}

Controller層

    @Operation(summary = "保存或更新公寓信息")@PostMapping("saveOrUpdate")public Result saveOrUpdate(@RequestBody ApartmentSubmitVo apartmentSubmitVo) {apartmentInfoService.saveOrUpdateApartment(apartmentSubmitVo);return Result.ok();}

Service層

 void saveOrUpdateApartment(ApartmentSubmitVo apartmentSubmitVo);
/*** 保存或更新公寓信息** @param apartmentSubmitVo 公寓信息提交對象*                          若傳入公寓ID為空,則執行插入操作;若不為空,則執行更新操作*                          更新操作時會先刪除原有配套、雜費、標簽和圖片信息,再插入新的信息*/@Overridepublic void saveOrUpdateApartment(ApartmentSubmitVo apartmentSubmitVo) {//保存或修改公寓信息://1.判斷該參數id是否為空,為空:插入的新數據 不為空:修改數據boolean isUpdate = apartmentSubmitVo.getId() != null;//2.調用父類保存或修改方法,將公寓基本信息進行保存super.saveOrUpdate(apartmentSubmitVo);if (isUpdate) {//修改數據:直接將所有原數據刪除后重新插入//1.刪除配套LambdaQueryWrapper<ApartmentFacility> facilityLambdaQueryWrapper = new LambdaQueryWrapper<>();facilityLambdaQueryWrapper.eq(ApartmentFacility::getApartmentId, apartmentSubmitVo.getId());facilityService.remove(facilityLambdaQueryWrapper);//2.刪除雜費LambdaQueryWrapper<ApartmentFeeValue> feeValueLambdaQueryWrapper = new LambdaQueryWrapper<>();feeValueLambdaQueryWrapper.eq(ApartmentFeeValue::getFeeValueId, apartmentSubmitVo.getId());feeValueService.remove(feeValueLambdaQueryWrapper);//3.刪除標簽LambdaQueryWrapper<ApartmentLabel> labelLambdaQueryWrapper = new LambdaQueryWrapper<>();labelLambdaQueryWrapper.eq(ApartmentLabel::getLabelId, apartmentSubmitVo.getId());labelService.remove(labelLambdaQueryWrapper);//4.刪除圖片LambdaQueryWrapper<GraphInfo> graphInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();graphInfoLambdaQueryWrapper.eq(GraphInfo::getId, apartmentSubmitVo.getId());graphInfoService.remove(graphInfoLambdaQueryWrapper);}//1.插入配套List<Long> facilityInfoIdsList = apartmentSubmitVo.getFacilityInfoIds();if (!CollectionUtils.isEmpty(facilityInfoIdsList)) {ArrayList<ApartmentFacility> facilityArrayList = new ArrayList<>();for (Long facilityId : facilityInfoIdsList) {ApartmentFacility apartmentFacility = ApartmentFacility.builder().build();apartmentFacility.setFacilityId(facilityId);apartmentFacility.setApartmentId(apartmentSubmitVo.getId());facilityArrayList.add(apartmentFacility);}facilityService.saveBatch(facilityArrayList);}//2.插入雜費List<Long> feeValueIds = apartmentSubmitVo.getFeeValueIds();if (!CollectionUtils.isEmpty(feeValueIds)) {ArrayList<ApartmentFeeValue> apartmentFeeValueList = new ArrayList<>();for (Long feeValueId : feeValueIds) {ApartmentFeeValue apartmentFeeValue = ApartmentFeeValue.builder().build();apartmentFeeValue.setApartmentId(apartmentSubmitVo.getId());apartmentFeeValue.setFeeValueId(feeValueId);apartmentFeeValueList.add(apartmentFeeValue);}feeValueService.saveBatch(apartmentFeeValueList);}//3.插入標簽List<Long> labelIds = apartmentSubmitVo.getLabelIds();if (!CollectionUtils.isEmpty(labelIds)) {ArrayList<ApartmentLabel> apartmentLabelArrayList = new ArrayList<>();for (Long labelId : labelIds) {ApartmentLabel apartmentLabel = ApartmentLabel.builder().build();apartmentLabel.setApartmentId(apartmentSubmitVo.getId());apartmentLabel.setLabelId(labelId);apartmentLabelArrayList.add(apartmentLabel);}labelService.saveBatch(apartmentLabelArrayList);}//4.插入圖片List<GraphVo> graphVoList = apartmentSubmitVo.getGraphVoList();if (!CollectionUtils.isEmpty(graphVoList)) {ArrayList<GraphInfo> graphInfos = new ArrayList<>();for (GraphVo graphVo : graphVoList) {GraphInfo graphInfo = new GraphInfo();graphInfo.setItemType(ItemType.APARTMENT);graphInfo.setItemId(apartmentSubmitVo.getId());graphInfo.setName(graphVo.getName());graphInfo.setUrl(graphVo.getUrl());graphInfos.add(graphInfo);}graphInfoService.saveBatch(graphInfos);}}

2. 根據條件分頁查詢

請求數據結構

@Data
@Schema(description = "公寓查詢實體")
public class ApartmentQueryVo {@Schema(description = "省份id")private Long provinceId;@Schema(description = "城市id")private Long cityId;@Schema(description = "區域id")private Long districtId;
}

?響應數據結構

@Data
@Schema(description = "后臺管理系統公寓列表實體")
public class ApartmentItemVo extends ApartmentInfo {@Schema(description = "房間總數")private Long totalRoomCount;@Schema(description = "空閑房間數")private Long freeRoomCount;}

Controller層

    @Operation(summary = "根據條件分頁查詢公寓列表")@GetMapping("pageItem")public Result<IPage<ApartmentItemVo>> pageItem(@RequestParam long current, @RequestParam long size, ApartmentQueryVo queryVo) {Page<ApartmentItemVo> page = new Page<>(current, size);IPage<ApartmentItemVo> result = apartmentInfoService.pageItem(page, queryVo);return Result.ok(result);}

Service層

IPage<ApartmentItemVo> pageItem(Page<ApartmentItemVo> page, ApartmentQueryVo queryVo);
    @Overridepublic IPage<ApartmentItemVo> pageItem(Page<ApartmentItemVo> page, ApartmentQueryVo queryVo) {return apartmentInfoMapper.pageItem(page, queryVo);}

Mapper層

IPage<ApartmentItemVo> pageApartmentItemByQuery(IPage<ApartmentItemVo> page, ApartmentQueryVo queryVo);

多表聯查大sql

    <select id="pageItem" resultType="com.atguigu.lease.web.admin.vo.apartment.ApartmentItemVo">select ai.id,ai.name,ai.introduction,ai.district_id,ai.district_name,ai.city_id,ai.city_name,ai.province_id,ai.province_name,ai.address_detail,ai.latitude,ai.longitude,ai.phone,ai.is_release,ifnull(tc.cnt, 0)                     total_room_count,ifnull(tc.cnt, 0) - ifnull(cc.cnt, 0) free_room_countfrom (select id,name,introduction,district_id,district_name,city_id,city_name,province_id,province_name,address_detail,latitude,longitude,phone,is_releasefrom apartment_info<where>is_deleted=0<if test="queryVo.provinceId != null">and province_id=#{queryVo.provinceId}</if><if test="queryVo.cityId != null">and city_id=#{queryVo.cityId}</if><if test="queryVo.districtId != null">and district_id=#{queryVo.districtId}</if></where>) aileft join(select apartment_id,count(*) cntfrom room_infowhere is_deleted = 0and is_release = 1group by apartment_id) tcon ai.id = tc.apartment_idleft join(select apartment_id,count(*) cntfrom lease_agreementwhere is_deleted = 0and status in (2, 5)group by apartment_id) ccon ai.id = cc.apartment_id</select>

knife4j調整傳遞參數

默認情況下Knife4j為該接口生成的接口文檔如下圖所示,其中的queryVo參數不方便調試?

可在application.yml文件中增加如下配置,將queryVo做打平處理

springdoc:default-flat-param-object: true

?

?3.?根據ID獲取公寓詳細信息

響應數據

@Schema(description = "公寓信息")
@Data
public class ApartmentDetailVo extends ApartmentInfo {@Schema(description = "圖片列表")private List<GraphVo> graphVoList;@Schema(description = "標簽列表")private List<LabelInfo> labelInfoList;@Schema(description = "配套列表")private List<FacilityInfo> facilityInfoList;@Schema(description = "雜費列表")private List<FeeValueVo> feeValueVoList;
}

?Controller層

    @Operation(summary = "根據ID獲取公寓詳細信息")@GetMapping("getDetailById")public Result<ApartmentDetailVo> getDetailById(@RequestParam Long id) {ApartmentDetailVo apartmentDetailVo = apartmentInfoService.getDetailById(id);return Result.ok(apartmentDetailVo);}

Service層

ApartmentDetailVo getDetailById(Long id);
    @Overridepublic ApartmentDetailVo getDetailById(Long id) {//1.查詢公寓基本信息ApartmentInfo apartmentInfo = apartmentInfoMapper.selectById(id);//2.查詢圖片列表List<GraphVo> graphVoList = graphInfoMapper.selectGraphVoList(id, ItemType.APARTMENT);//3.查詢標簽列表List<LabelInfo> labelInfoList = labelInfoMapper.selectLabelInfoList(id); //通過公寓id查詢出所有標簽id,在通過標簽id查出所有標簽信息//4.查詢配套列表List<FacilityInfo> facilityInfoList = facilityInfoMapper.selectFacilityInfoList(id); //通過公寓id查詢出所有配套id,在通過配套id查出所有配套信息//5.查詢雜費列表List<FeeValueVo> feeValueList = feeValueMapper.selectFeeValueList(id); //通過公寓id查詢出所有雜費值id,在通過雜費值id查出所有雜費以及雜費名稱id,再通過雜費名稱id查出雜費名//6.組裝結果ApartmentDetailVo apartmentDetailVo = new ApartmentDetailVo();BeanUtils.copyProperties(apartmentInfo, apartmentDetailVo);apartmentDetailVo.setGraphVoList(graphVoList);apartmentDetailVo.setLabelInfoList(labelInfoList);apartmentDetailVo.setFacilityInfoList(facilityInfoList);apartmentDetailVo.setFeeValueVoList(feeValueList);return apartmentDetailVo;}

Mapper。。。

4. 根據ID刪除公寓信息

    @Operation(summary = "根據id刪除公寓信息")@DeleteMapping("removeById")public Result removeById(@RequestParam Long id) {apartmentInfoService.removeApartmentById(id);return Result.ok();}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45273.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45273.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45273.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LLM用于時序預測真的不行,連推理能力都沒用到

語言模型真的能用于時序預測嗎&#xff1f;根據貝特里奇頭條定律&#xff08;任何以問號結尾的新聞標題&#xff0c;都能夠用「不」來回答&#xff09;&#xff0c;答案應該是否定的。事實似乎也果然如此&#xff1a;強大如斯的 LLM 并不能很好地處理時序數據。 時序&#xff0…

tkinter-TinUI-xml實戰(11)多功能TinUIxml編輯器

引言 在TinUIXml簡易編輯器中&#xff0c;我們通過TinUI搭建了一個簡易的針對TinUIXml布局的編輯器&#xff0c;基本掌握了TinUIXml布局和TinUIXml的導入與導出。現在&#xff0c;就在此基礎上&#xff0c;對編輯器進行升級。 本次升級的功能&#xff1a; 更合理的xml編輯與…

docker私有倉庫harbor安裝

Harbor默認安裝 下載harbor https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz 目前要求docker版本&#xff0c;docker 20.10.10-ce &#xff0c;和docker-compose 1.18.0 查看 docker-compose版本 docker-compose --ver…

Django前后端打通

跨域問題 【 0 】前言 ? ? 同源策略&#xff08;Same Origin Policy&#xff09;是瀏覽器安全策略的重要組成部分&#xff0c;它限制了來自不同源的網頁之間的數據交互&#xff0c;以防止惡意攻擊。當一個網頁嘗試執行與它的源&#xff08;即協議、域名和端口&#xff09…

【區分vue2和vue3下的element UI Carousel 走馬燈組件,分別詳細介紹屬性,事件,方法如何使用,并舉例】

在 Vue 2 中&#xff0c;我們通常使用 Element UI&#xff0c;而在 Vue 3 中&#xff0c;我們則使用 Element Plus 作為其替代品。對于 Carousel 走馬燈組件&#xff0c;這兩個庫提供了相似的功能&#xff0c;但在 Vue 2 和 Vue 3 的上下文中&#xff0c;它們的屬性、事件和方法…

C\C++ 終端輸出帶有顏色的字符

終端顯示帶有顏色的字符 終端顯示帶有顏色的字符 終端顯示帶有顏色的字符背景&#xff1a;測試機器&#xff0c;win10系統&#xff0c; VS2022編寫字體設置不同的顏色背景色光標移動 &#xff08;這個用的估計不是很多&#xff09;字體設置動態顯示C cout 也可以測試代碼準確的…

接口基礎知識3:詳解url

課程大綱 一、定義 URL即訪問的鏈接&#xff0c;是Uniform Resource Locator的縮寫&#xff0c;譯為"統一資源定位符"。 URL是一種URI&#xff0c;它標識一個互聯網資源&#xff0c;并指定對其進行操作或獲取該資源的方法。可能通過對主要訪問手段的描述&#xff0c…

SpringBoot詳細解析

1.什么是springboot springboot也是spring公司開發的一款框架。為了簡化spring項目的初始化搭建的。那么spring對應springboot有什么缺點呢&#xff1f; spring項目搭建的缺點: 配置麻煩依賴tomcat啟動慢 2.springboot的特點 自動配置 Spring Boot的自動配置是一個運行時&…

Docker 安裝ros 使用rviz 等等圖形化程序

Docker 安裝ros 使用rviz 等等圖形化程序 ubuntu 版本與ros 發行版本對應 如何安裝其它版本ros 此時考慮使用docker 易于維護 地址&#xff1a; https://hub.docker.com/r/osrf/ros 我主機是 ubuntu22.04 使用這個標簽 melodic-desktop-full 1 clone 鏡像到本機 docker pu…

Android OkHttp3中HttpLoggingInterceptor使用

目錄 一 概述1.1 日志級別 二 使用2.1 引入依賴2.2 創建對象2.3 添加攔截器 三 結果展示3.1 日志級別為BODY3.2 日志級別為BASIC3.3 日志級別為HEADERS 參考 一 概述 HttpLoggingInterceptor是OkHttp3提供的攔截器&#xff0c;用來記錄HTTP請求和響應的詳細信息。 1.1 日志級…

基于IDEA的Lombok插件安裝及簡單使用

lombok介紹 Lombok能以注解形式來簡化java代碼&#xff0c;提高開發效率。開發中經常需要寫的javabean&#xff0c;都需要花時間去添加相應的getter/setter&#xff0c;也許還要去寫構造器、equals等方法&#xff0c;而且需要維護。而Lombok能通過注解的方式&#xff0c;在編譯…

Spring AOP 實現 Excel 導出統一處理

你好&#xff0c;我是柳岸花開。在實際開發中&#xff0c;經常會遇到需要導出 Excel 數據的需求。為了避免代碼重復&#xff0c;我們可以使用 Spring AOP&#xff08;面向切面編程&#xff09;來實現 Excel 導出的統一處理。本文將介紹如何使用 Spring AOP 在項目中統一處理 Ex…

【學習筆記】無人機(UAV)在3GPP系統中的增強支持(十三)-更換無人機控制器

引言 本文是3GPP TR 22.829 V17.1.0技術報告&#xff0c;專注于無人機&#xff08;UAV&#xff09;在3GPP系統中的增強支持。文章提出了多個無人機應用場景&#xff0c;分析了相應的能力要求&#xff0c;并建議了新的服務級別要求和關鍵性能指標&#xff08;KPIs&#xff09;。…

枚舉的高階用法之枚舉里寫方法以及注入spring的bean

1、前言 一般我們使用枚舉都是用來定義一些常量。比如我們需要一個表示訂單類(pc訂單、手機訂單)的常量,那我們就可以使用枚舉來實現,如下: AllArgsConstructor public enum OrderTypeEnum{PC("PC", "電腦端"),PHONE("PHONE", "手機端&quo…

[計網初識2]web的3個核心標準html,url,http

學習內容 HTML,URL,HTTP的構成 1.規范web的3個核心標準&#xff1f; HTML(Hyper Text Markup Language),規范網頁內容和版面布局的表示標準。URL(Uniform Resource Locator)&#xff0c;規范網頁識別符格式和含義的表示標準。HTTP(HyperText Transfer Protocl),規范游覽器如…

JIRA的高級搜索JIRA Query Language(JQL)詳解

JIRA的高級搜索功能非常強大&#xff0c;允許用戶通過JIRA Query Language&#xff08;JQL&#xff09;來構建復雜的查詢。以下是一些常用的高級搜索用法和示例&#xff1a; 1. 基本語法 JQL的基本語法包括字段、運算符和值的組合。例如&#xff1a; field operator value2.…

<數據集>UA-DETRAC車輛識別數據集<目標檢測>

數據集格式&#xff1a;VOCYOLO格式 圖片數量&#xff1a;20500張 標注數量(xml文件個數)&#xff1a;20500 標注數量(txt文件個數)&#xff1a;20500 標注類別數&#xff1a;4 標注類別名稱&#xff1a;[car, van, others, bus] 序號類別名稱圖片數框數1car201871259342…

鋇錸ARMxy控制器在智能網關中的應用

隨著IoT物聯網技術的飛速發展&#xff0c;智能網關作為連接感知層與網絡層的樞紐&#xff0c;可以實現感知網絡和通信網絡以及不同類型感知網絡之間的協議轉換。鋇錸技術的ARMxy系列控制器憑借其高性能、低功耗和高度靈活性的特點&#xff0c;在智能網關中發揮了關鍵作用&#…

數據結構回顧(Java)

1.數組 線性表 定義的方式 int[] anew int[10] 為什么查詢快&#xff1f; 1.可以借助O(1)時間復雜度訪問某一元素&#xff0c; 2.地址連續&#xff0c;邏輯連續 3.數組長度一旦確定就不可以被修改 當需要擴容的時候需要將老數組的內容復制過來 在Java中數組是一個對象 Ar…

bug定位策略

前提--用戶環境層面 hosts異常&#xff1a;hosts文件主要是加快某個域名或者網站的解析速度&#xff0c;從而達到快速訪問的作用&#xff0c;也可以屏蔽網站。hosts異常可能會導致部分網頁無法訪問&#xff0c;能夠加載&#xff0c;但是網頁無法正常顯示&#xff1b;測試環境臟…