SpringBoot學習日記 Day5:解鎖企業級開發核心技能

一、前言:從玩具項目到生產系統

經過前四天的學習,我們已經能夠開發基礎功能了。但要讓應用真正具備生產價值,還需要掌握數據庫高級操作、事務控制、緩存優化等企業級開發技能。今天就來攻克這些關鍵知識點!

二、JPA進階:讓數據庫操作更高效

1. 復雜查詢的三種實現方式

方式一:方法名派生查詢

public interface UserRepository extends JpaRepository<User, Long> {// 根據姓名模糊查詢+年齡范圍List<User> findByUsernameContainingAndAgeBetween(String name, Integer minAge, Integer maxAge);// 統計大于某年齡的用戶數Long countByAgeGreaterThan(Integer age);
}

方式二:@Query注解(JPQL)

@Query("SELECT u FROM User u WHERE u.dept.id = :deptId AND u.status = :status")
List<User> findUsersByDeptAndStatus(@Param("deptId") Long deptId, @Param("status") Integer status);

方式三:原生SQL查詢

@Query(value = "SELECT * FROM users WHERE reg_time > :date", nativeQuery = true)
List<User> findRecentUsers(@Param("date") Date date);

2. 分頁查詢最佳實踐

@GetMapping("/users")
public PageResult<User> getUsers(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer size,@RequestParam(required = false) String name) {Pageable pageable = PageRequest.of(page - 1, size, Sort.by("createTime").descending());Page<User> userPage;if (StringUtils.isEmpty(name)) {userPage = userRepository.findAll(pageable);} else {userPage = userRepository.findByUsernameContaining(name, pageable);}return PageResult.success(userPage);
}

3. 關聯關系實戰(用戶-部門示例)

實體類配置:

@Entity
@Data
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;@ManyToOne@JoinColumn(name = "dept_id")private Department department;
}@Entity
@Data
public class Department {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@OneToMany(mappedBy = "department")private List<User> users;
}

查詢優化建議:

1. 使用@EntityGraph解決N+1查詢問題:

@EntityGraph(attributePaths = {"department"})
List<User> findAllWithDepartment();

2. 延遲加載時注意事務范圍:

// 在Service層方法上添加事務注解
@Transactional(readOnly = true)
public User getUserDetail(Long id) {User user = userRepository.findById(id).orElseThrow();// 此時可以安全訪問延遲加載的關聯對象System.out.println(user.getDepartment().getName());return user;
}

三、事務管理:數據一致性的守護者

1. 聲明式事務基礎

@Service
@RequiredArgsConstructor
public class OrderService {private final OrderRepository orderRepository;private final UserRepository userRepository;@Transactionalpublic void createOrder(OrderDTO dto) {// 扣減用戶余額User user = userRepository.findById(dto.getUserId()).orElseThrow(() -> new BusinessException("用戶不存在"));user.setBalance(user.getBalance() - dto.getAmount());userRepository.save(user);// 創建訂單Order order = new Order();// 設置訂單屬性...orderRepository.save(order);// 如果這里拋出異常,上面所有操作都會回滾}
}

2. 事務傳播行為實驗

傳播行為說明適用場景
REQUIRED(默認)當前有事務則加入,沒有則新建大多數業務方法
REQUIRES_NEW總是新建事務,掛起當前事務日志記錄等獨立操作
NESTED在當前事務嵌套子事務部分需要獨立回滾的子流程

測試用例:

@Transactional
public void parentMethod() {// 操作1...childMethod();  // 測試不同傳播行為// 操作2...
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void childMethod() {// 子方法操作...
}

四、Redis緩存:性能加速器

1. 集成Redis三步走

第一步:添加依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

第二步:配置連接

spring:redis:host: localhostport: 6379password: database: 0

第三步:啟用緩存

@SpringBootApplication
@EnableCaching
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}

2. 緩存注解實戰

@Service
public class UserService {// 緩存查詢結果@Cacheable(value = "user", key = "#id")public User getUserById(Long id) {return userRepository.findById(id).orElseThrow();}// 更新時清除緩存@CacheEvict(value = "user", key = "#user.id")public User updateUser(User user) {return userRepository.save(user);}// 條件緩存@Cacheable(value = "user", key = "#name", unless = "#result == null")public User getUserByName(String name) {return userRepository.findByUsername(name);}
}

五、文件操作:用戶頭像上傳實戰

1. 配置文件上傳

spring:servlet:multipart:max-file-size: 2MBmax-request-size: 10MB

2. 實現上傳接口

@PostMapping("/avatar/upload")
public Result<String> uploadAvatar(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {throw new BusinessException("請選擇文件");}// 生成唯一文件名String fileName = UUID.randomUUID() + "." + FileUtil.getExtension(file.getOriginalFilename());// 保存文件Path path = Paths.get("uploads/avatars", fileName);try {Files.createDirectories(path.getParent());file.transferTo(path);} catch (IOException e) {throw new BusinessException("文件上傳失敗");}return Result.success("/avatars/" + fileName);
}

3. 文件下載實現

@GetMapping("/avatar/download/{filename:.+}")
public void downloadAvatar(@PathVariable String filename, HttpServletResponse response) throws IOException {Path path = Paths.get("uploads/avatars", filename);if (!Files.exists(path)) {response.sendError(404, "文件不存在");return;}response.setContentType("image/jpeg");Files.copy(path, response.getOutputStream());
}

六、今日成果:用戶管理系統升級版

1. 數據庫層:

?? - 實現多表關聯查詢

?? - 支持分頁排序

?? - 完善事務管理

2. 緩存層:

?? - 高頻查詢結果緩存

?? - 自動更新緩存策略

3. 文件操作:

?? - 頭像上傳下載功能

?? - 文件大小限制處理

4. API增強:

// 分頁查詢示例
GET /users?page=1&size=10&name=張&sort=age,desc// 頭像上傳
POST /avatar/upload// 帶緩存的用戶查詢
GET /users/{id}

七、避坑指南

1. N+1查詢問題:

?? - 使用@EntityGraph或JOIN FETCH優化

?? - 測試時開啟SQL日志觀察查詢次數

2. 事務失效場景:

?? - 方法必須是public

?? - 自調用問題(AOP失效)

?? - 異常類型默認只回滾RuntimeException

3. 緩存一致性:

?? - 更新數據庫后及時清除緩存

?? - 考慮使用@CachePut更新緩存

4. 文件存儲安全:

?? - 校驗文件類型(不要僅靠擴展名)

?? - 限制上傳目錄權限

?? - 考慮使用云存儲服務

八、明日計劃

1. 學習SpringBoot定時任務

2. 集成郵件發送功能

3. 實現系統監控端點

4. 探索AOP統一日志處理

思考題:在電商系統中,下單操作需要扣減庫存、生成訂單、扣減優惠券等多個步驟,該如何設計事務邊界?歡迎評論區分享你的設計方案!

如果覺得這篇日記有幫助,請點贊收藏支持~完整代碼示例可通過私信獲取。在實際開發中遇到問題也歡迎留言討論!

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

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

相關文章

將英文PDF文件完整地翻譯成中文的4類方式

文章目錄一、在線翻譯服務&#xff08;最快捷&#xff0c;適合臨時查看&#xff09;1.1 代表工具&#xff1a;1.2 操作流程&#xff08;以Google翻譯為例&#xff09;1.3 優點和缺點1.4 適用場景二、專業軟件&#xff08;最佳平衡&#xff0c;兼顧格式與質量&#xff09;2.1 代…

【分享】我國八大沙漠空間矢量范圍

今天小編整理分享的是 我國八大沙漠空間矢量范圍shp。▲ 我國八大沙漠空間矢量范圍概況數據概況我國八大沙漠空間矢量范圍。中國八大沙漠。分別為騰格里沙漠&#xff0c;塔克拉馬干沙漠&#xff0c;巴丹吉林沙漠&#xff0c;庫布奇沙漠&#xff0c;烏蘭布和沙漠&#xff0c;庫…

【音視頻】WebRTC C++ native 編譯

一、搭建環境 我們這里介紹在Windows10VS2019的環境下編譯WebRTC源碼&#xff0c;由于WebRTC源碼在外網上&#xff0c;需要科學的方式下載&#xff0c;不然下載特別慢&#xff0c;建議直接找國內下載好的源碼&#xff0c;這里的源碼是2021年的版本&#xff1a;https://pan.bai…

Selenium在Pyhton應用

目錄 1. selenium的基本原理 2. selenium環境的搭建步驟 3. 元素的定位和操作 4.元素的基本屬性方法 5.瀏覽器的操作方法 6.三種等待 強制等待 顯示等待 隱式等待 7. 鍵盤與鼠標的操作 鼠標懸停用 拖拽操作 8. 下拉框元素定位 9.頁面滾動操作 10. 頁面截圖操作 S…

【Docker】Redis基礎命令在Docker中的使用

文章目錄一 Redis 容器化部署指南1 獲取 Redis 鏡像2 服務啟動2.1 首次啟動新容器2.2 重啟已有容器3 服務驗證4 連接 Redis5 數據持久化方案5.1 使用 Docker 卷5.2 啟用 AOF 持久化6 容器管理6.1 停止容器6.2 刪除容器7 數據清理7.1 清空 Redis 數據7.2 完全移除7.3 刪除數據卷…

ubuntu 2024 安裝拼音輸入法

1. 卸載ibussudo apt remove ibus2. install fcitx5核心組件sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-material-color3. 安裝中文語言支持sudo apt install language-pack-zh-hans4. 設置默認輸入法im-config -n fcitx55. 配置環境變量sudo vim ~/.bashrc粘貼&am…

語言模型的多個agent

是的&#xff0c;語言模型 在某些情況下確實可以通過多個 agent&#xff08;代理&#xff09;來共同協作完成任務。這種設計通常用于復雜任務或需要多步驟處理的場景&#xff0c;具體的流程如下&#xff1a; 1. 什么是 Agent&#xff1f; Agent&#xff08;代理&#xff09; 是…

CSS--:root指定變量,其他元素引用

原文網址&#xff1a;CSS--:root指定變量&#xff0c;其他元素引用-CSDN博客 簡介 本文介紹CSS中使用變量的方法。 場景描述 CSS可以使用變量&#xff0c;比如&#xff1a;指定整個網頁的主體顏色作為變量&#xff0c;其他的元素去使用這個顏色。這樣在修改顏色時&#xff…

秋招筆記-8.7

今天先來補充一下關于Unity和UE的一些問題&#xff0c;后續開始深挖項目&#xff1a;Unity關于fixed update和update&#xff1a;同一幀中物理更新優先執行&#xff1f;關于協程&#xff1a;協程是基于迭代器實現的&#xff0c;而迭代器是基于狀態機實現的。協程的本質是編譯器…

DAY 26 函數專題1:函數定義與參數

浙大疏錦行知識點回顧&#xff1a; 函數的定義變量作用域&#xff1a;局部變量和全局變量函數的參數類型&#xff1a;位置參數、默認參數、不定參數傳遞參數的手段&#xff1a;關鍵詞參數傳遞參數的順序&#xff1a;同時出現三種參數類型時 作業 #作業1 import math def calcul…

跨學科視域下的深層語義分析與人類底層邏輯一致性探索

摘要本文章旨在系統性地探討一個前沿的交叉學科研究課題&#xff1a;如何通過深層語義分析&#xff0c;探索并建模人類認知中普遍存在的底層邏輯一致性。此研究橫跨自然語言處理&#xff08;NLP&#xff09;、知識圖譜&#xff08;KG&#xff09;、認知科學、腦神經科學、系統科…

Flink CDC如何保障數據的一致性?

Flink CDC 通過 Checkpoint 機制、冪等性設計 和 事務一致性協議 保障數據同步的一致性。以下是具體實現方式和關鍵配置&#xff1a;1. Checkpoint 機制&#xff08;核心保障&#xff09;作用&#xff1a;定期保存同步狀態&#xff08;包括 Binlog 位置和全量快照進度&#xff…

上傳文件至華為云OBS

1 創建華為云Bucket1.1 創建Bucket1.2 獲取Bucket的Endpoint1.3 獲取訪問憑證注&#xff1a;每個訪問密鑰僅能下載一次&#xff0c;為了賬號安全性&#xff0c;建議您定期更換并妥善保存訪問密鑰。不再使用的訪問密鑰&#xff0c;建議停用和刪除。2 創建Sprint Boot工程創建一個…

使用驅動移除內核回調,

https://br-sn.github.io/Removing-Kernel-Callbacks-Using-Signed-Drivers/ 原創 大藍 RJ45實驗室 使用簽名驅動移除內核回調-安全KER - 安全資訊平臺 介紹 創建該PoC的目的是了解驅動漏洞利用程序的強大功能&#xff0c;以及EDR如何使用內核回調以防止惡意軟件的攻擊。…

從零搭建Cloud Alibaba (下) Sentinel篇

1.Sentinel控制臺的安裝 下載地址&#xff1a; Releases alibaba/Sentinelx 下載后是一個jar包 進入目錄 CMD命令 java -jar "sentinel-dashboard-1.8.8 .jar" 如果發生了端口沖突則使用以下命令啟動 修改端口號為8090 java -Dserver.port8090 -jar "sen…

Numpy科學計算與數據分析:Numpy數學函數入門與實踐

Numpy數學函數實戰&#xff1a;探索數學運算的無限可能 學習目標 通過本課程的學習&#xff0c;學員將掌握Numpy中常用的數學函數&#xff0c;包括三角函數、指數函數和對數函數的使用方法&#xff0c;以及如何利用這些函數對數組進行高效的數學運算。本課程不僅會講解理論知識…

BIGO Ads是什么?BIGO廣告營銷核心玩法解析

在全球化競爭白熱化的當下&#xff0c;BIGO Ads憑借其覆蓋150國家的龐大流量池和AI驅動的精準營銷能力&#xff0c;已成為出海企業突破增長瓶頸的利器。2025年Q1數據顯示&#xff0c;BIGO Ads廣告業務同比增長27%&#xff0c;非直播收入占比達24.9%&#xff0c;成為歡聚集團第二…

人工智能領域、圖歐科技、IMYAI智能助手2025年3月更新月報

2025年3月AI領域重要技術進展與平臺更新概覽 2025年3月&#xff0c;人工智能領域迎來一系列重要技術更新與平臺功能迭代&#xff0c;尤其在多模態模型、圖像生成編輯、視頻生成、大型語言模型&#xff08;LLM&#xff09;性能提升等方面表現活躍。以下是對關鍵進展的梳理&#…

STM32HAL 快速入門(一):點燈前的準備 —— 從軟件安裝到硬件原理

前言 大家好&#xff0c;這里是 Hello_Embed。嵌入式開發的 “Hello World” 是點燈 —— 通過控制單片機引腳的高低電平&#xff0c;讓 LED 亮滅。要實現這個功能&#xff0c;前期準備必不可少&#xff1a;從軟件安裝到硬件原理理解&#xff0c;每一步都很關鍵。本文就來詳細說…

Python網絡編程技術

一、網絡編程基礎概念 1.1 什么是網絡編程&#xff1f; 定義&#xff1a;程序通過網絡與其他程序進行通信的技術。核心目標&#xff1a;實現數據在不同主機或進程間的傳輸與交互。應用場景&#xff1a;Web服務、API調用、實時通信、分布式系統等。 1.2 網絡通信模型 OSI七層…