【 蒼穹外賣 | Day2】

1. 相關視頻

Day2的全部視頻集數

2. 學習記錄

2.1 對象屬性拷貝

當DTO與實體類或者VO對象之間的一個裝換的時候,如果通過new創建對象,然后調用set方法進行屬性賦值,不夠方便,代碼不夠簡潔。當屬性過多時候,代碼就會顯得臃腫。所以采用對象屬性拷貝。推薦使用MapStruct

public void save(EmployeeDTO employee){BeanUtils.copyProperties(employeeDTO,employee);
}

MapStruct 快速指南 | Baeldung中文網


2.2 分頁查詢

分頁查詢,項目經常遇到的功能,本人也學過相關的知識,編寫過相關的代碼,這里也記錄一下

對于分頁,可以采取MySQL的limit關鍵字,但是在實際項目的開發,這樣寫不夠代碼的簡潔以及提高代碼量,工作效率低下,因此還是使用框架來進行分頁查詢的開發

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelper}</version>
</dependency>

( 對于版本的多少,可以去maven的repository復制,這里主要是作于技術的記錄 )

這個插件底層是基于mybatis的攔截器,會將我們的sql語句查詢進行一個拼接,動態拼接limit的參數,并且基于參數的計算輸出結果

這里使用分頁查詢插件,最終也還是使用到MySQL的語句進行查詢,似乎好像還有其他的框架可以不需要寫MySQL語句,直接就是調用就可以返回相關的結果,這個大家可以在評論區討論

前提準備

@Data
public class EmployeePageQueryDTO implements Serializable {//員工姓名private String name;//頁碼private int page;//每頁顯示記錄數private int pageSize;}/*----------------------------------------------------------------*//*** 封裝分頁查詢結果*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult implements Serializable {private long total; //總記錄數private List records; //當前頁數據集合}

@Service
public class EmployeeServiceImpl implements EmployeeService { /*** 分頁查詢** @param pageQueryDTO  分頁查詢參數* @return  分頁結果*/@Overridepublic PageResult page(EmployeePageQueryDTO pageQueryDTO) {// 使用pageHelper分頁查詢PageHelper.startPage(pageQueryDTO.getPage(), pageQueryDTO.getPageSize());// 這里需要進行MySQL語句的查詢Page<Employee> page = employeeMapper.page(pageQueryDTO);long total = page.getTotal();List<Employee> records = page.getResult();return new PageResult(total, records);}
}/*--------------------------------------------------------------------*/@Mapper
public interface EmployeeMapper {/*** 分頁查詢* @param pageQueryDTO  分頁查詢參數* @return  分頁結果*/Page<Employee> page(EmployeePageQueryDTO pageQueryDTO);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.EmployeeMapper"><select id="page" resultType="com.sky.entity.Employee">select * from employee<where><if test="name != null and name != ''">and name like concat('%', #{name}, '%')</if>order by crate_time desc</where></select>
</mapper>

使用like關鍵字進行一個模糊查詢

友情提醒:mapper文件中的SQL語句不要加分號,否則會報錯,因為你加分號之后,limit拼接在之后,就不是正確的mysql語句


3. JWT流程 && ThreadLocal

4. 時間格式處理

推薦使用第二種方式,因為第二種方式是一個統一的配置。如果沒有進行一個配置的話,那么返回的是一個集合。另外這里的converters是我們Spring MVC中所有的轉換器,并且有順序排列使用,增加的消息轉換器是排在最后,那么為了讓我們自定義的轉換器優先使用,就需要設置權重

注意:是MappingJackson2HttpMessageConverter,不是MappingJackson2CborHttpMessageConverter,沒有Cbor

/*** 對象映射器:基于jackson將Java對象轉為json,或者將json轉為Java對象* 將JSON解析為Java對象的過程稱為 [從JSON反序列化Java對象]* 從Java對象生成JSON的過程稱為 [序列化Java對象到JSON]*/
public class JacksonObjectMapper extends ObjectMapper {public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";//public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";public JacksonObjectMapper() {super();//收到未知屬性時不報異常this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);//反序列化時,屬性不存在的兼容處理this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);SimpleModule simpleModule = new SimpleModule().addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))).addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))).addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))).addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))).addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))).addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));//注冊功能模塊 例如,可以添加自定義序列化器和反序列化器this.registerModule(simpleModule);}
}

5. 完善蒼穹外賣 —— 密碼修改業務

自己完成蒼穹外賣的員工密碼修改功能

定義傳輸數據的DTO對象

一開始,看著接口文檔還有一個Integer類型的empId,但是經過我后面調試,以及在前端使用f12開啟開發者工具,發現前端的請求只有下方兩個屬性,因此進行修改

@Data
public class EmployeePasswordDTO {private String newPassword;private String oldPassword;
}

因為這個業務涉及到如果員工的舊密碼輸入不對,那么無法進行一個密碼的修改,因此需要定義一個常量OLD_PASSWORD_ERROR和將修改方法的類型設計為boolean類型,不是void類型

/*** 信息提示常量類*/
public class MessageConstant {public static final String OLD_PASSWORD_ERROR = "舊密碼輸入錯誤";
}
// Controller層/*** 修改密碼* @param passwordDTO  密碼DTO* @return  修改結果*/@PutMapping("/editPassword")@ApiOperation(value = "修改員工密碼")public Result<String> updatePassword(@RequestBody EmployeePasswordDTO passwordDTO){log.info("修改密碼:{}", passwordDTO);if (!employeeService.updatePassword(passwordDTO))return Result.error(MessageConstant.OLD_PASSWORD_ERROR);return Result.success();}
// ServiceImpl層/*** 修改員工密碼** @param passwordDTO  員工密碼信息*/@Overridepublic boolean updatePassword(EmployeePasswordDTO passwordDTO) {Long empId = BaseContext.getCurrentId();Employee employee = employeeMapper.getById(empId);String oldPassword = DigestUtils.md5DigestAsHex(passwordDTO.getOldPassword().getBytes());if (!employee.getPassword().equals(oldPassword)) {return false;}employee.setPassword(DigestUtils.md5DigestAsHex(passwordDTO.getNewPassword().getBytes()));employee.setUpdateTime(LocalDateTime.now());employee.setUpdateUser(empId);employeeMapper.update(employee);return true;}

這里ServiceImpl沒有做很多解釋,有涉及MD5密碼的一個不可逆,更新時間以及更新用戶的修改,MySQL的修改的語句等這些內容,大家自己看看代碼吧,如果是在看不懂,那么評論提出疑問,看到就會即時回復給大家

至于這個繼承的接口層就不詳細放出,如果這個不會,那么這個博客沒有看的必要,先打好基礎

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

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

相關文章

焊接自動化測試平臺圖像處理分析-模型訓練推理

1、使用技術棧&#xff1a;jdk17/springboot/python/opencv/yolov8 2、JAVA環境搭建 JDK17下載安裝&#xff1a;wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 解壓軟件 tar -xf jdk-17.0.16_linux-x64_bin.tar.gz 配置全局變量 vim /etc/p…

【python實用小腳本-205】[HR揭秘]手工黨逐行查Bug的終結者|Python版代碼質量“CT機”加速器(建議收藏)

1. 場景故事 “作為HR&#xff0c;我曾用2小時逐行審閱50份Python簡歷項目&#xff0c;直到發現候選人的代碼復雜度超標導致線上事故…” → 轉折點&#xff1a;用麥凱布&#xff08;McCabe&#xff09;圈復雜度檢測腳本&#xff0c;30秒掃描全倉庫&#xff0c;現可100%攔截“高…

LeetCode - 1089. 復寫零

題目 1089. 復寫零 - 力扣&#xff08;LeetCode&#xff09; 思路 這道題我首先想到的是從前往后雙指針&#xff0c;但是這樣做會造成數據的覆蓋&#xff0c;比如說下面的這個情況 所以解決的方法就是從后往前去復寫&#xff0c;但是從后往前的話就要知道最后一個有效元素是…

c#中public類比博圖

簡單來說&#xff0c;**public 定義了“接口”或“引腳”**&#xff0c;就像你的FB塊上的 Input, Output, InOut 管腳一樣。它決定了外部的其他代碼&#xff08;如另一個FB或OB1&#xff09;可以看到和操作這個塊里的什么東西。讓我用你最熟悉的博圖概念來詳細類比一下。---###…

K8s基于節點軟親和的高 CPU Pod 擴容與優先調度方案

場景與目標 集群節點&#xff1a;master&#xff08;4 核&#xff09;、node1&#xff08;16 核&#xff09;、node2&#xff08;16 核&#xff09;。目標&#xff1a;將一個高 CPU 消耗的工作負載橫向擴展到 4 個實例&#xff0c;并通過**節點親和性&#xff08;軟親和&#…

MySQL InnoDB 的鎖機制

引言 鎖是數據庫管理并發訪問的另一種核心機制&#xff0c;與 MVCC 相輔相成。本文將系統梳理 MySQL InnoDB 中鎖的粒度、類型和工作原理&#xff0c;并深入探討它如何與事務隔離級別配合&#xff0c;共同保障數據的一致性和完整性。 一、 鎖的粒度&#xff1a;由粗到細 InnoD…

狀態模式(State Pattern)——網絡連接場景的 C++ 實戰

一、為什么要用狀態模式&#xff1f;在開發中&#xff0c;經常遇到“對象在不同狀態下行為不同”的情況。最常見的寫法是用一堆 if/else 或 switch 來判斷狀態&#xff0c;然后在不同分支里寫邏輯。這樣做有兩個問題&#xff1a;狀態增多后&#xff0c;條件分支會變得臃腫。修改…

使用csi-driver-nfs實現K8S動態供給

文章目錄一、部署NFS二、k8s環境部署csi-nfs三、測試動態供給補充應用服務器IPnfs-server192.168.1.5k8s-master01192.168.1.1k8s-node01192.168.1.2k8s-node02192.168.1.3 一、部署NFS 1、在NFS服務端和k8s所有節點部署nfs-utils 因為客戶端去掛載nfs服務端的共享目錄時&…

【開題答辯全過程】以 基于ssm的房屋中介管理系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

MySQL主從復制之進階延時同步、GTID復制、半同步復制完整實驗流程

1.主從同步1.1主從同步原理是指將主庫的DDL和DML操作通過二進制日志(binlog)傳到從庫服務器&#xff0c;然后在從庫上對這些日志進行重新執行&#xff0c;從而使從庫和主庫數據保持一致1.2環境設置庫名ip地址操作系統mysql版本主庫msyql-master192.168.31.228rhel7.9源碼安裝my…

織信低代碼:用更聰明的方式,把想法變成現實!

你有沒有過這樣的時刻&#xff1f;想親手做一個應用&#xff0c;卻因為“不會編碼”而遲遲沒有開始&#xff1b;或曾無奈地目睹公司里一個看似簡單的需求&#xff0c;硬是耗費數月、投入大量人力反復開發……現在&#xff0c;有一類工具正在改變這一切。它叫低代碼。而今天我們…

【序列晉升】28 云原生時代的消息驅動架構 Spring Cloud Stream的未來可能性

目錄 一、Spring Cloud Stream是什么&#xff1f; 二、誕生背景與設計動機 2.1 微服務架構的挑戰 2.2 Spring生態的發展 2.3 Spring Integration的演進 三、架構設計與核心組件 3.1 分層架構設計 3.2 核心組件詳解 3.3 編程模型 四、解決的問題與優勢 4.1 解決的核心…

內網后滲透攻擊--linux系統(權限維持)

用途限制聲明&#xff0c;本文僅用于網絡安全技術研究、教育與知識分享。文中涉及的滲透測試方法與工具&#xff0c;嚴禁用于未經授權的網絡攻擊、數據竊取或任何違法活動。任何因不當使用本文內容導致的法律后果&#xff0c;作者及發布平臺不承擔任何責任。滲透測試涉及復雜技…

C++筆記之同步信號量、互斥信號量與PV操作再探(含軟考題目)

C++筆記之同步信號量、互斥信號量與PV操作再探(含軟考題目) code review! 參考筆記: 1.C++筆記之同步信號量、互斥信號量與PV操作再探(含軟考題目) 2.C++筆記之信號量、互斥量與PV操作 參考鏈接 1.嵌入式基礎知識-信號量,PV原語與前趨圖 2.信號量、PV操作及軟考高級試題解析…

布隆過濾器:快速判斷某個元素是否存在

特點&#xff1a;高效、空間占用小、允許一定誤判 布隆過濾器在 Redis 里的實現機制&#xff0c;核心就是&#xff1a;用一個大位圖&#xff08;bitmap&#xff09;來表示集合 位圖長度 m 初始值都是 0 插入元素時通過 k 個不同的哈希函數&#xff0c;對元素做哈希 每個哈希結…

C# 修改基類List中某一元素的子類類型

描述&#xff1a;基類&#xff1a;BaseClass子類1&#xff1a;A子類2&#xff1a;B然后我有一個List<BaseClass>類型的鏈表:list&#xff0c;我先往list中添加了兩個元素&#xff1a;第一個元素為A類型&#xff0c;第二個元素為B類型&#xff0c;然后我想改變第一個元素類…

基于STM32智能陽臺監控系統

基于STM32智能陽臺監控系統&#xff08;程序&#xff0b;原理圖元件清單&#xff09;功能介紹具體功能&#xff1a;1.采用STM32作為主控芯片實現檢測和控制&#xff1b;2.通過光敏電阻采集光線&#xff0c;將當前光線值在LCD1602顯示&#xff0c;低于50%控制LED亮&#xff0c;高…

動態維護有效區間:滑動窗口

右指針不斷移動獲取解&#xff0c;左指針不斷移動縮小解范圍 左指針的意義非常重要&#xff0c;相當于一個標兵&#xff0c;不斷與這個標兵進行比較&#xff0c;如果符合要求&#xff0c;這左指針進行移動&#xff0c;并進行操作&#xff0c;如果不符合要求&#xff0c;則左指針…

嵌入式學習---(單片機)

1.UART的概念通用異步收發器&#xff0c;2個串口&#xff08;1個串口被用于ISP下載程序&#xff0c;1個串口被用于和主機之間的通信&#xff09;&#xff0c;RXD(接收信號線) TXD(發送信號線)2、單工、半雙工、全雙工概念對比維度單工&#xff08;Simplex&#xff09;半雙工&am…

基于單片機的寵物屋智能系統設計與實現(論文+源碼)

1設計思路本設計基于單片機的寵物屋智能系統核心是實現對寵物生活環境及狀態的智能管理。系統以單片機為中樞&#xff0c;連接紅外測溫傳感器&#xff0c;可實時精準捕捉寵物體溫變化&#xff0c;以便及時發現健康異常&#xff1b;水位檢測傳感器時刻監測飲用水余量&#xff0c…