最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 項(xiàng)目開發(fā)全流程實(shí)戰(zhàn)示例總結(jié)

 更新時(shí)間:2026年01月13日 10:06:28   作者:無名-CODING  
本文詳細(xì)介紹了SpringBoot項(xiàng)目的開發(fā)流程,從實(shí)體類定義到Controller接口開放,涵蓋了代碼注釋、核心概念圖解及高頻面試題,通過實(shí)際操作,展示了如何實(shí)現(xiàn)用戶增刪改查功能,感興趣的朋友跟隨小編一起看看吧

Spring Boot 項(xiàng)目開發(fā)全流程實(shí)戰(zhàn)指南:從 0 到 1 實(shí)現(xiàn) CURD(含面試題)

?? 發(fā)布時(shí)間:2026-01-11
??? 標(biāo)簽:Java, Spring Boot, 教程, 后端開發(fā), RESTful
?? 摘要:本文專為 Java 初學(xué)者量身打造,手把手帶你理解 Spring Boot 項(xiàng)目的標(biāo)準(zhǔn)開發(fā)流程。從 Entity 實(shí)體類定義,到 Controller 接口開放,全鏈路打通。包含超詳細(xì)的代碼注釋、核心概念圖解以及高頻面試題。

?? 一、 引言:Spring Boot 開發(fā)在做什么?

很多新手在剛接觸 Spring Boot 時(shí),會(huì)被各種層級(jí)搞暈:Controller, Service, Mapper, Entity… 到底先寫誰?誰調(diào)誰?

其實(shí),Web 開發(fā)的核心流程就像餐廳的點(diǎn)餐流程:

  1. Controller (服務(wù)員):直接面對(duì)客人(前端),拿著菜單(接口文檔),記錄客人的需求(接收請(qǐng)求參數(shù)),把菜端給客人(返回響應(yīng)數(shù)據(jù))。
  2. Service (大廚):負(fù)責(zé)核心烹飪(業(yè)務(wù)邏輯)。比如把肉切好、炒熟。如果發(fā)現(xiàn)菜沒了(異常),就告訴服務(wù)員。
  3. Mapper/Repository (采購(gòu)員):只負(fù)責(zé)去倉(cāng)庫(kù)(數(shù)據(jù)庫(kù))拿原材料(增刪改查數(shù)據(jù)),不負(fù)責(zé)烹飪。
  4. Entity (食材):就是在各個(gè)環(huán)節(jié)傳遞的數(shù)據(jù)對(duì)象(比如紅燒肉)。

今天我們就來演示如何制作一道 “用戶管理” 的菜。

??? 二、 項(xiàng)目結(jié)構(gòu)與開發(fā)順序

一個(gè)標(biāo)準(zhǔn)的 Spring Boot 項(xiàng)目,通常包含以下層級(jí)(建議按此順序編寫):

  1. ?? Entity (實(shí)體層):定義數(shù)據(jù)庫(kù)表結(jié)構(gòu)對(duì)應(yīng)的 Java 類。
  2. ?? Mapper/DAO (持久層):操作數(shù)據(jù)庫(kù)的接口(MyBatis 或 JPA)。
  3. ?? Service (業(yè)務(wù)層):編寫復(fù)雜的業(yè)務(wù)邏輯。
  4. ?? Controller (控制層):對(duì)外暴露 URL 接口。

?? 三、 代碼實(shí)戰(zhàn):實(shí)現(xiàn)用戶增刪改查

我們將實(shí)現(xiàn)一個(gè)簡(jiǎn)單的用戶管理功能。

3.1 第一步:Entity (食材準(zhǔn)備)

實(shí)體類是數(shù)據(jù)的載體,直接對(duì)應(yīng)數(shù)據(jù)庫(kù)中的表。我們分兩步來寫:

1. 類定義與主鍵配置
首先定義類的主體結(jié)構(gòu),并配置好主鍵生成策略。

package com.example.demo.entity;
import lombok.Data; // Lombok 插件,自動(dòng)生成 getter/setter/toString
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
/**
 * 用戶實(shí)體類
 * 對(duì)應(yīng)數(shù)據(jù)庫(kù)表:t_user
 */
@Data // Lombok 注解:自動(dòng)生成 Getter, Setter, ToString, HashCode 等方法,省去手動(dòng)編寫
@Entity // JPA 注解:聲明這是一個(gè)實(shí)體類,與數(shù)據(jù)庫(kù)表映射
@Table(name = "t_user") // 指定對(duì)應(yīng)的數(shù)據(jù)庫(kù)表名為 t_user
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 主鍵 ID
     * @Id: 標(biāo)識(shí)該屬性為主鍵
     * @GeneratedValue: 指定主鍵生成策略,IDENTITY 表示使用數(shù)據(jù)庫(kù)自增 (Auto Increment)
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // ... 下面繼續(xù)添加其他字段

2. 業(yè)務(wù)字段定義
接下來,在 User 類中補(bǔ)充用戶名、密碼等業(yè)務(wù)字段。

    /**
     * 用戶名
     * @Column: 映射數(shù)據(jù)庫(kù)字段屬性
     * nullable = false: 數(shù)據(jù)庫(kù)這一列不能為空
     * unique = true: 用戶名必須唯一
     */
    @Column(nullable = false, unique = true, length = 50)
    private String username;
    /**
     * 密碼 (實(shí)際開發(fā)中不能存明文,要存加密后的哈希值)
     */
    @Column(nullable = false, length = 100)
    private String password;
    /**
     * 郵箱
     */
    @Column(length = 100)
    private String email;
    /**
     * 創(chuàng)建時(shí)間
     * 用于記錄這一條數(shù)據(jù)是什么時(shí)候插入生成的
     */
    @Column(name = "create_time")
    private Date createTime;
}

3.2 第二步:Mapper/Repository (倉(cāng)庫(kù)采購(gòu))

這里演示使用 Spring Data JPA,它非常強(qiáng)大,只需繼承 JpaRepository 接口,基本的增刪改查代碼都不用自己寫!

package com.example.demo.repository;
import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
 * 用戶持久層接口
 * 繼承 JpaRepository<實(shí)體類類型, 主鍵類型>
 * 
 * 作用:這就是那個(gè)"采購(gòu)員",Spring Boot 自動(dòng)幫你實(shí)現(xiàn)好了去數(shù)據(jù)庫(kù)拿數(shù)據(jù)的方法:
 * - save(User user): 保存或更新
 * - findById(Long id): 根據(jù)ID查詢
 * - findAll(): 查詢所有
 * - deleteById(Long id): 根據(jù)ID刪除
 */
@Repository // 標(biāo)記這是持久層組件,Spring 會(huì)把它放入容器管理
public interface UserRepository extends JpaRepository<User, Long> {
    /**
     * 自定義查詢方法
     * JPA 的神奇之處:只要按照規(guī)則命名方法,SQL 語句自動(dòng)生成!
     * 
     * 翻譯:select * from t_user where username = ?
     */
    User findByUsername(String username);
    /**
     * 翻譯:select * from t_user where email = ?
     */
    User findByEmail(String email);
}

3.3 第三步:Service (大廚烹飪)

業(yè)務(wù)邏輯都在這里。我們將代碼拆分為兩個(gè)部分:基礎(chǔ)注入和核心業(yè)務(wù)邏輯。

1. 依賴注入與類結(jié)構(gòu)
首先,我們需要把 UserRepository (采購(gòu)員) 注入進(jìn)來,方便后續(xù)調(diào)用。

package com.example.demo.service;
import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
@Service // 標(biāo)記這是業(yè)務(wù)層組件
public class UserService {
    @Autowired // 依賴注入:告訴 Spring,我要用這個(gè)采購(gòu)員(Repository),請(qǐng)幫我送進(jìn)來
    private UserRepository userRepository;

2. 核心業(yè)務(wù):注冊(cè)邏輯
這是最復(fù)雜的邏輯,包含參數(shù)校驗(yàn)、重名檢查和數(shù)據(jù)補(bǔ)全。

    /**
     * 新增用戶 (注冊(cè))
     * 業(yè)務(wù)邏輯:
     * 1. 檢查用戶名是否存在
     * 2. 補(bǔ)全創(chuàng)建時(shí)間
     * 3. 保存到數(shù)據(jù)庫(kù)
     */
    @Transactional // 開啟事務(wù):保證一系列操作要么全成功,要么全失敗
    public User register(User userData) {
        // 1. 簡(jiǎn)單校驗(yàn)
        if (userData.getUsername() == null) {
            throw new RuntimeException("用戶名不能為空");
        }
        // 2. 檢查是不是重名了
        User existUser = userRepository.findByUsername(userData.getUsername());
        if (existUser != null) {
            throw new RuntimeException("用戶名已存在,換一個(gè)吧");
        }
        // 3. 補(bǔ)全系統(tǒng)字段 (創(chuàng)建時(shí)間)
        userData.setCreateTime(new Date());
        // 4. 調(diào)用持久層保存
        return userRepository.save(userData);
    }

3. 其他業(yè)務(wù)邏輯
查詢和刪除相對(duì)簡(jiǎn)單,直接調(diào)用 Repository 的方法即可。

    /**
     * 查詢所有用戶列表
     */
    public List<User> findAllUsers() {
        return userRepository.findAll();
    }
    /**
     * 根據(jù) ID 刪除用戶
     */
    @Transactional
    public void deleteUser(Long id) {
        if (!userRepository.existsById(id)) {
            throw new RuntimeException("要?jiǎng)h除的用戶不存在!");
        }
        userRepository.deleteById(id);
    }
}

3.4 第四步:Controller (服務(wù)員接客)

這是對(duì)外的窗口,通常遵循 RESTful 風(fēng)格設(shè)計(jì)。為了清晰,我們按功能模塊拆分代碼。

1. 控制器初始化
定義 API 的基礎(chǔ)路徑 /api/users,并注入 Service。

package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * 用戶管理控制器
 * @RestController = @Controller + @ResponseBody
 */
@RestController // 聲明這是一個(gè) REST 風(fēng)格的控制器
@RequestMapping("/api/users") // 定義統(tǒng)一的基礎(chǔ)路徑
public class UserController {
    @Autowired
    private UserService userService; // 注入大廚 (Service)

2. 查詢接口 (GET)
對(duì)應(yīng) HTTP GET 請(qǐng)求,用于獲取資源。

    /**
     * 獲取用戶列表
     * URL: GET /api/users
     */
    @GetMapping 
    public List<User> list() {
        return userService.findAllUsers();
    }

3. 新增接口 (POST)
對(duì)應(yīng) HTTP POST 請(qǐng)求,用于創(chuàng)建資源。注意 @RequestBody 的使用,它負(fù)責(zé)接收 JSON 數(shù)據(jù)。

    /**
     * 注冊(cè)新用戶
     * URL: POST /api/users
     * @RequestBody: 讀取請(qǐng)求體中的 JSON 數(shù)據(jù)轉(zhuǎn)為 User 對(duì)象
     */
    @PostMapping
    public String add(@RequestBody User user) {
        try {
            userService.register(user);
            return "注冊(cè)成功!"; 
        } catch (Exception e) {
            return "注冊(cè)失敗: " + e.getMessage();
        }
    }

4. 刪除接口 (DELETE)
對(duì)應(yīng) HTTP DELETE 請(qǐng)求。注意 @PathVariable 用于從 URL 中提取 ID。

    /**
     * 刪除用戶
     * URL: DELETE /api/users/{id} (例如 /api/users/5)
     * @PathVariable: 從 URL 路徑中提取 {id} 的值
     */
    @DeleteMapping("/{id}")
    public String delete(@PathVariable Long id) {
        try {
            userService.deleteUser(id);
            return "刪除成功";
        } catch (Exception e) {
            return "刪除失敗: " + e.getMessage();
        }
    }
}

?? 四、 核心概念名詞解釋(小白必看)

1. IoC (控制反轉(zhuǎn)) 與 DI (依賴注入)

  • IoC:以前我們需要對(duì)象,必須自己 new UserService()?,F(xiàn)在我們把創(chuàng)建對(duì)象的權(quán)利交給 Spring 容器(管家)。
  • DI:我們需要用對(duì)象時(shí),在屬性上加個(gè) @Autowired,Spring 就會(huì)幫我們把創(chuàng)建好的對(duì)象注入進(jìn)來。

2. Spring Bean

  • 被 Spring 容器管理的對(duì)象就叫 Bean。
  • 只要加上 @Controller, @Service, @Repository, @Component 這些注解,類就會(huì)變成 Bean。

3. JSON

  • 前后端交互的"普通話"。Controller 返回的 Java 對(duì)象會(huì)被自動(dòng)轉(zhuǎn)換成 JSON 字符串格式(比如 {"name": "張三", "age": 18}),前端 JS 能輕松看懂。

??‍♂? 五、 高頻面試題 QA

Q1:@RestController@Controller 有什么區(qū)別?

  • A
  • @Controller:通常用于傳統(tǒng)的 Web 開發(fā),方法默認(rèn)返回的是視圖名字(比如 index.html 的文件名),用于跳轉(zhuǎn)頁面。如果要返回 JSON 數(shù)據(jù),需要在方法上額外加 @ResponseBody。
  • @RestController:是 @Controller@ResponseBody 的組合注解。用它標(biāo)記的類,所有方法默認(rèn)都返回 數(shù)據(jù) (JSON/XML),主要用于前后端分離開發(fā)。

Q2:Post 請(qǐng)求和 Get 請(qǐng)求的區(qū)別?(RESTful 視角)

  • A
  • GET:用于獲取資源。它是冪等的(查一次和查很多次結(jié)果一樣),參數(shù)拼接在 URL 后面,不安全且長(zhǎng)度有限。
  • POST:用于新建資源(比如提交表單)。參數(shù)放在 Request Body 中,相對(duì)安全且無大小限制。

Q3:Service 層和 Controller 層的區(qū)別?代碼寫在一個(gè)層行不行?

A

  • 從技術(shù)上講,所有代碼寫在 Controller 甚至直接寫在 JSP 里都能跑,但這不僅難以維護(hù),也沒法復(fù)用。
  • Controller:負(fù)責(zé)接收請(qǐng)求參數(shù)校驗(yàn)。
  • Service:負(fù)責(zé)業(yè)務(wù)邏輯(比如轉(zhuǎn)賬計(jì)算、邏輯判斷)。這樣如果其他 Controller 或者定時(shí)任務(wù)也需要用到這個(gè)邏輯,直接注入 Service 即可,實(shí)現(xiàn)了復(fù)用。

Q4:@Autowired@Resource 都可以注入,有什么區(qū)別?

A

  • @Autowired:是 Spring 提供的注解。默認(rèn)按類型 (Type) 裝配(只要你是 UserService 類我就注入)。
  • @Resource:是 JDK (Java標(biāo)準(zhǔn)) 提供的注解。默認(rèn)按名稱 (Name) 裝配(找 ID 叫 userService 的 bean)。

?? 六、 總結(jié)

Spring Boot 開發(fā)其實(shí)就是一場(chǎng)流水線作業(yè):

  1. 定義實(shí)體:確定數(shù)據(jù)長(zhǎng)什么樣。
  2. 寫 Repository:解決怎么存取數(shù)據(jù)。
  3. 寫 Service:處理復(fù)雜的業(yè)務(wù)規(guī)則。
  4. 寫 Controller:把功能暴露出去給別人用。

到此這篇關(guān)于Spring Boot 項(xiàng)目開發(fā)全流程實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Spring Boot 項(xiàng)目開發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA中取整數(shù)的4種方法總結(jié)

    JAVA中取整數(shù)的4種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于JAVA中取整數(shù)的4種方法,在java的Math類中,提供了許許多多的和數(shù)學(xué)計(jì)算有關(guān)的方法,其中也包括取整的,需要的朋友可以參考下
    2023-07-07
  • Spring Boot開發(fā)中加密數(shù)據(jù)的模糊搜索解決方案詳解

    Spring Boot開發(fā)中加密數(shù)據(jù)的模糊搜索解決方案詳解

    在SpringBoot中實(shí)現(xiàn)加密手機(jī)號(hào)的模糊搜索,需在數(shù)據(jù)安全、業(yè)務(wù)功能和系統(tǒng)性能之間進(jìn)行權(quán)衡,簡(jiǎn)單解密后查詢方案僅適用于極小規(guī)模應(yīng)用,本文介紹Spring Boot開發(fā)中加密數(shù)據(jù)的模糊搜索解決方案,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Spring的@PreAuthorize注解自定義權(quán)限校驗(yàn)詳解

    Spring的@PreAuthorize注解自定義權(quán)限校驗(yàn)詳解

    這篇文章主要介紹了Spring的@PreAuthorize注解自定義權(quán)限校驗(yàn)詳解,由于項(xiàng)目中,需要對(duì)外開放接口,要求做請(qǐng)求頭校驗(yàn),不做其他權(quán)限控制,所以準(zhǔn)備對(duì)開放的接口全部放行,不做登錄校驗(yàn),需要的朋友可以參考下
    2023-11-11
  • 詳解IDEA用maven創(chuàng)建springMVC項(xiàng)目和配置

    詳解IDEA用maven創(chuàng)建springMVC項(xiàng)目和配置

    本篇文章主要介紹了詳解IDEA用maven創(chuàng)建springMVC項(xiàng)目和配置 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Springboot異常錯(cuò)誤處理解決方案詳解

    Springboot異常錯(cuò)誤處理解決方案詳解

    這篇文章主要介紹了Springboot異常錯(cuò)誤處理解決方案詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Intellij IDEA 2020.3 配置教程詳解

    Intellij IDEA 2020.3 配置教程詳解

    這篇文章主要介紹了Intellij IDEA 2020.3 配置教程詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 通過自定制LogManager實(shí)現(xiàn)程序完全自定義的logger

    通過自定制LogManager實(shí)現(xiàn)程序完全自定義的logger

    本章主要闡述怎么完全定制化LogManager來實(shí)現(xiàn)應(yīng)用程序完全自定制的logger,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • java對(duì)接支付寶支付項(xiàng)目的實(shí)戰(zhàn)記錄

    java對(duì)接支付寶支付項(xiàng)目的實(shí)戰(zhàn)記錄

    最近公司有一個(gè)需求是接入第三方支付(微信&支付寶),我接到了支付寶支付,所以下面這篇文章主要給大家介紹了關(guān)于java對(duì)接支付寶支付項(xiàng)目的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • SpringBoot集成Tess4J實(shí)現(xiàn)OCR的示例代碼

    SpringBoot集成Tess4J實(shí)現(xiàn)OCR的示例代碼

    Tess4J是一個(gè)基于Tesseract OCR引擎的Java接口,可以用來識(shí)別圖像中的文本,說白了,就是封裝了它的API,讓Java可以直接調(diào)用,本文給大家介紹了SpringBoot集成Tess4J實(shí)現(xiàn)OCR的示例,需要的朋友可以參考下
    2024-12-12
  • maven打包時(shí)候修改包名稱帶上git版本號(hào)和打包時(shí)間方式

    maven打包時(shí)候修改包名稱帶上git版本號(hào)和打包時(shí)間方式

    這篇文章主要介紹了maven打包時(shí)候修改包名稱帶上git版本號(hào)和打包時(shí)間方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論

连山| 新泰市| 资阳市| 庆城县| 宜城市| 若尔盖县| 天全县| 甘德县| 黄冈市| 理塘县| 兰州市| 博乐市| 盐山县| 宣化县| 苗栗市| 嘉荫县| 施甸县| 金塔县| 延寿县| 柘荣县| 稻城县| 当阳市| 潼南县| 南漳县| 泰顺县| 静乐县| 龙江县| 新乐市| 夹江县| 伊宁市| 淮阳县| 沁水县| 红原县| 常州市| 虹口区| 泊头市| 年辖:市辖区| 扬中市| 和政县| 青岛市| 石景山区|