SpringMVC(四)Restful軟件架構風格

目錄

?編輯

API接口設計的架構風格

一 Dao層實現(處理數據庫)

二 Sercice層實現(處理業務邏輯)

三 Controller層(處理http請求)

四 補充知識點

1 @PathVariable - 路徑變量

2 @CrossOrigin(Origins = "*")允許跨域訪問

3 可以在路徑之前加上需要訪問的路徑


restful 概念引入 REST(表現層狀態轉移Representional State Transfer)是一種軟件架構風格。

旨在構建高效、可拓展的分布式系統,尤其適用于Web服務,其核心思想是通過統一的接口和資源操作實現客戶端于服務器之間的交互。REST 憑借其簡潔、靈活的特點,成為現代 Web 服務的基石。

API接口設計的架構風格

API接口:Web應用暴露出來的讓別人訪問的請求路徑。jar包封裝的API接口。

CRUD案例實現:

一 Dao層實現(處理數據庫)

結構圖

代碼實現:

創建一個bean類,用來放數據庫用戶的信息

package org.example.springmvc.bean;import lombok.Getter;
import lombok.Setter;@Setter
@Getter
public class Employee {private Integer id;private String name;private Integer age;private String gender;public Employee(Integer id, String name, Integer age, String gender) {this.id = id;this.name = name;this.age = age;this.gender = gender;}public Employee() {}@Overridepublic String toString() {return "Employee{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}

定義一個接口里面寫上需要的方法

package org.example.springmvc.dao;import org.example.springmvc.bean.Employee;public interface EmployeeDao {// 查詢根據ID查詢員工Employee getEmployeeById(Integer id);// 添加員工void addEmployee(Employee employee);// 修改員工void updateEmployee(Employee employee);// 刪除員工(根據ID)void deleteEmployee(Integer id);}

接口的實現類(數據庫增刪改查的具體實現)

package org.example.springmvc.dao.Impl;import org.example.springmvc.bean.Employee;
import org.example.springmvc.dao.EmployeeDao;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;@Component
public class EmployeeDaoImpl implements EmployeeDao {private final JdbcTemplate jdbcTemplate;// 注入JdbcTemplatepublic EmployeeDaoImpl(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}@Overridepublic Employee getEmployeeById(Integer id) {String sql = "select * from first_tb where id = ?";return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Employee.class), id);}@Overridepublic void addEmployee(Employee employee) {String sql = "insert into first_tb(id,name,age,gender) values(?,?,?,?)";jdbcTemplate.update(sql, employee.getId(), employee.getName(), employee.getAge(), employee.getGender());}@Overridepublic void updateEmployee(Employee employee) {String sql = "update first_tb set name = ?,age = ?,gender = ? where id = ?";jdbcTemplate.update(sql, employee.getName(), employee.getAge(), employee.getGender(), employee.getId());}@Overridepublic void deleteEmployee(Integer id) {String sql = "delete from first_tb where id = ?";jdbcTemplate.update(sql, id);}
}

測試類實現:(CRUD)

package org.example.springmvc;import org.example.springmvc.bean.Employee;
import org.example.springmvc.dao.EmployeeDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class SpringTest {@AutowiredEmployeeDao employeeDao;@Testpublic void test() {// 查Employee employee = employeeDao.getEmployeeById(1);System.out.println(employee);// 增刪改employeeDao.addEmployee(new Employee(7, "超哥", 18, "男"));employeeDao.updateEmployee(new Employee(1, "賢哥", 18, "男"));employeeDao.deleteEmployee(5);}
}

二 Sercice層實現(處理業務邏輯)

結構圖:

接口:

package org.example.springmvc.service;import org.example.springmvc.bean.Employee;public interface EmployeeService {// 根據id查詢員工Employee getEmployeeById(Integer id);// 添加員工void addEmployee(Employee employee);// 修改員工void updateEmployee(Employee employee);// 刪除員工void deleteEmployee(Integer id);}

接口的實現類:(實現更新操作的非空判斷)

package org.example.springmvc.service.Impl;import org.example.springmvc.bean.Employee;
import org.example.springmvc.dao.EmployeeDao;
import org.example.springmvc.service.EmployeeService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;@Service
public class EmployeeServiceImpl implements EmployeeService {private final EmployeeDao employeeDao;// 注入daopublic EmployeeServiceImpl(EmployeeDao EmployeeDao) {this.employeeDao = EmployeeDao;}@Overridepublic Employee getEmployeeById(Integer id) {return employeeDao.getEmployeeById(id);}@Overridepublic void addEmployee(Employee employee) {employeeDao.addEmployee(employee);}@Overridepublic void updateEmployee(Employee employee) {//防空處理,考慮到service是被controller調用的,所以要考慮某些屬性是空的,需要進行處理//1 去數據庫查詢到原來的值//2 把頁面帶來的值覆蓋原來的值,頁面沒帶的保持原狀Integer id = employee.getId();if (id == null) {return;}// 獲取數據庫當中的Employee employeeById = employeeDao.getEmployeeById(id);//傳過來的值不是空串,將值傳遞給數據庫if (StringUtils.hasText(employee.getName())) {employeeById.setName(employee.getName());}if (StringUtils.hasText(employee.getGender())) {employeeById.setGender(employee.getGender());}if (employee.getAge() != null) {employeeById.setAge(employee.getAge());}employeeDao.updateEmployee(employeeById);}@Overridepublic void deleteEmployee(Integer id) {employeeDao.deleteEmployee(id);}
}

測試類:

    @AutowiredEmployeeService employeeService;@Testpublic void test1() {Employee employee = new Employee();employee.setId(7);employee.setAge(100);employeeService.updateEmployee(employee);}

三 Controller層(處理http請求)

代碼實現:

    /*** 統一返回JSON* code: 說明:業務狀態碼,前后端商定不同的業務狀態嗎* msg: 說明:提示信息,前端根據業務狀態碼和提示信息進行業務邏輯處理* data: 說明:返回的數據* 前端統一處理業務邏輯,根據業務狀態碼和提示信息進行業務邏輯處理* 1 前端發送請求* 2 判斷狀態碼,成功就顯示數據,失敗就提示提示信息(或其它操作)**/
package org.example.springmvc.common;public class R<T> {private final Integer code;private final String msg;private final T data;// 私有化構造器,強制通過靜態工廠方法創建對象private R(Integer code, String msg, T data) {this.code = code;this.msg = msg;this.data = data;}// -------------------- 成功響應快捷方法 --------------------public static R<?> ok() {return new R<>(200, "success", null);}public static <T> R<T> ok(T data) {return new R<>(200, "success", data);}public static <T> R<T> ok(String msg, T data) {return new R<>(200, msg, data);}// -------------------- 錯誤響應快捷方法 --------------------public static R<?> error(int code, String msg) {return new R<>(code, msg, null);}public static R<?> error(ErrorCode errorCode) {return new R<>(errorCode.getCode(), errorCode.getMsg(), null);}// -------------------- 鏈式構建方法(可選) --------------------public R<T> withMsg(String msg) {return new R<>(this.code, msg, this.data);}public R<T> withData(T data) {return new R<>(this.code, this.msg, data);}// -------------------- Getter --------------------public Integer getCode() {return code;}public String getMsg() {return msg;}public T getData() {return data;}// -------------------- 狀態碼枚舉(可選) --------------------public enum ErrorCode {BAD_REQUEST(400, "參數錯誤"),UNAUTHORIZED(401, "未授權"),NOT_FOUND(404, "資源不存在"),INTERNAL_ERROR(500, "服務器內部錯誤");private final int code;private final String msg;ErrorCode(int code, String msg) {this.code = code;this.msg = msg;}public int getCode() {return code;}public String getMsg() {return msg;}}
}

需求類:

package org.example.springmvc.controller;import org.example.springmvc.bean.Employee;
import org.example.springmvc.common.R;
import org.example.springmvc.service.EmployeeService;
import org.springframework.web.bind.annotation.*;@RestController
public class EmployeeRestController {EmployeeService employeeService;// 構造器注入public EmployeeRestController(EmployeeService employeeService) {this.employeeService = employeeService;}// 根據id查詢員工// @RequestMapping(value = "/employee/{id}", method = RequestMethod.GET)@GetMapping(value = "/employee/{id}")public R get(@PathVariable("id") Integer id) {Employee employeeById = employeeService.getEmployeeById(id);return R.ok(employeeById);}// 根據id刪除員工// @RequestMapping(value = "/employee/{id}", method = RequestMethod.POST)@DeleteMapping(value = "/employee/{id}")public R delete(@PathVariable("id") Integer id) {employeeService.deleteEmployee(id);return R.ok();}// 添加員工,前端發送請求,把 json 數據封裝到 Employee 對象中@PostMapping(value = "/employee")public R add(@RequestBody Employee employee) {employeeService.addEmployee(employee);return R.ok();}// 修改員工@PutMapping(value = "/employee")public R update(@RequestBody Employee employee) {employeeService.updateEmployee(employee);return R.ok();}}

四 補充知識點

1 @PathVariable - 路徑變量

2 @CrossOrigin(Origins = "*")允許跨域訪問

3 可以在路徑之前加上需要訪問的路徑

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

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

相關文章

Docker搭建MySQL主從服務器

一、在主機上創建MySQL配置文件——my.cnf master服務器配置文件路徑&#xff1a;/data/docker/containers/mysql-cluster-master/conf.d/my.cnf slave服務器配置文件路徑&#xff1a; /data/docker/containers/mysql-cluster-master/conf.d/my.cnf master服務配置文件內容 …

鴻蒙路由 HMrouter 配置及使用一

1、學習鏈接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下載安裝 ohpm install hadss/hmrouter 添加編譯插件配置 在工程目錄下的build-profile.json5中&#xff0c;配置useNormalizedOHMUrl屬性為true (我這項目創…

智能家居分享

因為最近沉迷智能家居&#xff0c;所以來給大家分享一些輕松改變生活體驗的小家具 1&#xff1a; 智能門鎖 出門忘記帶鑰匙是許多人都遇到過的尷尬事&#xff0c;智能門鎖的出現完美解決了這個困擾。智能門鎖采用指紋識別、密碼、刷卡、手機等多種開鎖方式&#xff0c;大大增…

C#入門學習記錄(四)C#運算符詳解:掌握算術與條件運算符的必備技巧+字符串拼接

一、運算符概述 運算符是程序進行數學運算、邏輯判斷的核心工具&#xff0c;C#中的運算符分為&#xff1a; 算術運算符 → 數學計算&#xff08; - * / %&#xff09; 條件運算符 → 三目判斷&#xff08;?:&#xff09; 關系運算符 → 比較大小&#xff08;> < &#…

Linux中安裝Git

安裝Git 安裝git&#xff0c;我們可以使用yum指令在線安裝&#xff0c;這里&#xff0c;我們先對yum做一個簡單介紹。 執行下面命令 #查看可用的git安裝包 yum list git #安裝git yum install -y git 查看git安裝包 安裝git 驗證是否安裝成功 安裝完畢之后&#xff0c;我們…

開源免費一句話生成兒童故事視頻核心思想解析

再看一個演示視頻&#xff0c;學會核心思想后&#xff0c;可以打造自己的內容生成工具&#xff0c;后文有基于飛書多維表格的實現效果&#xff1a; 一句話靈感生成兒童故事視頻演示 這是一款專門為內容素材創作打造的創新工具&#xff0c;可根據用戶輸入的主題&#xff0c;快速…

Linux上的`i2c-tools`工具集的詳細介紹;并利用它操作IMX6ULL的I2C控制器進而控制芯片AP3216C讀取光照值和距離值

IC-Tools 工具集介紹 i2c-tools 是 Linux 下用于 IC 設備調試 的用戶空間工具集(你也可以把它看成是一個庫&#xff0c;類似于之前自己用過的觸摸屏庫tslib庫、FreeType矢量字符庫)&#xff0c;它提供了一系列命令行工具&#xff0c;可以掃描、讀取、寫入 IC 設備&#xff0c;…

Windows 部署 RuoYi 前后端分離項目

目錄 ruoyi-vue部署 ruoyi源碼類型 若依官方地址 RuoYi-Vue 前后端分離版 環境 工具 windows開發環境 jdk安裝 (安裝位置默認) 雙擊點擊安裝 步驟 耐心等待加載完畢&#xff0c;路徑默認 等待安裝完成即可 快速打開文件資源管理器 進入高級系統設置 系統屬性&#…

《C語言中的ASCII碼表:解鎖字符與數字的橋梁》

&#x1f680;個人主頁&#xff1a;BabyZZの秘密日記 &#x1f4d6;收入專欄&#xff1a;C語言 &#x1f30d;文章目入 一、什么是ASCII碼表&#xff1f;二、ASCII碼表的結構1. 控制字符&#xff08;0-31 和 127&#xff09;2. 可打印字符&#xff08;32-126&#xff09; 三、完…

Git刪除并重新推送遠程分支操作

在 Git 中&#xff0c;如果你刪除了遠程分支并希望重新推送一個新的遠程分支&#xff0c;可以按照以下步驟操作&#xff1a; 1. 刪除遠程分支 首先&#xff0c;刪除遠程分支&#xff1a; git push origin --delete <branch-name>其中&#xff0c; 是你要刪除的遠程分支…

連接不上雷電模擬器,adb連接不上問題的解決辦法

win7升win10后&#xff0c;adb shell連接不上&#xff0c;找不到指定文件&#xff0c;具體如下 f:\AndroidTool_Release_v2.35\bin>adb shell * daemon not running; starting now at tcp:5037 adb: CreateFileW nul failed: 系統找不到指定的文件。 (2) * failed to start…

el-table 插槽踩過的坑 :slot-scope 和#default的區別

slot-scope和#default是Vue中用于定義插槽的兩種不同語法&#xff0c;它們在Vue 2和Vue 3中有不同的應用場景和語法規則。? slot-scope 在?Vue 2.x?中&#xff0c;slot-scope是用于聲明具名插槽并獲取父組件傳遞過來的數據的主要方式。通過slot-scope可以定義一個變量scop…

一、初始 Linux

文章目錄 一、操作系統概述二、Linux 初識1. Linux 的組成2. Linux 發行版 三、遠程鏈接 Linux 系統1. 四、WSL (windows subsystem for linux)1. 什么是 WSL2. 如何下載 WSL3. 安裝不同的 Linux 發行版4. 啟動停止使用指定發行版5. 卸載與備份6. 文件共享7. 命令混用8. 用 vsc…

力扣128. 最長連續序列 || 452. 用最少數量的箭引爆氣球

最長連續列 給定一個未排序的整數數組 nums &#xff0c;找出數字連續的最長序列&#xff08;不要求序列元素在原數組中連續&#xff09;的長度。 請你設計并實現時間復雜度為 O(n) 的算法解決此問題。 輸入&#xff1a;nums [100,4,200,1,3,2] 輸出&#xff1a;4 解釋&…

Python教學:lambda表達式的應用-由DeepSeek產生

Python 中的 ?lambda 表達式?是一種簡潔的匿名函數&#xff0c;適合快速定義簡單邏輯的函數。它常用于需要函數作為參數的場景&#xff0c;如高階函數、排序、過濾等。以下是 lambda 的典型應用場景及示例&#xff1a; 1. ?基本語法? lambda 參數1, 參數2, ... : 表達式 特…

3D標定中的平面約束-平面方程的幾何意義

平面方程的一般形式為 AxByCzD0&#xff0c;其中系數 A、B、C、D共同決定了平面的幾何特性。 系數對平面姿態的影響 1. 法向量方向2. 平面位置3. 比例關系4. 姿態變換5.平面空間變換 1. 法向量方向 法向量方向由 A、B、C 決定 核心作用&#xff1a;系數 A、B、C 構成的向量 (…

C/C++藍橋杯算法真題打卡(Day6)

一、P8615 [藍橋杯 2014 國 C] 拼接平方數 - 洛谷 方法一&#xff1a;算法代碼&#xff08;字符串分割法&#xff09; #include<bits/stdc.h> // 包含標準庫中的所有頭文件&#xff0c;方便編程 using namespace std; // 使用標準命名空間&#xff0c;避免每次調用…

如何在 GoLand 中設置默認項目文件夾

在使用 GoLand 進行開發時&#xff0c;設置一個默認的項目文件夾可以大大提高工作效率。默認項目文件夾會在你打開或新建項目時自動預選&#xff0c;避免每次都需要手動導航到目標目錄。本文將詳細介紹如何在 GoLand 中設置默認項目文件夾。 步驟一&#xff1a;打開系統設置 …

DeepSeek私有化部署與安裝瀏覽器插件內網穿透遠程訪問實戰

文章目錄 前言1. 本地部署OllamaDeepSeek2. Page Assist瀏覽器插件安裝與配置3. 簡單使用演示4. 遠程調用大模型5. 安裝內網穿透6. 配置固定公網地址 前言 最近&#xff0c;國產AI大模型Deepseek成了網紅爆款&#xff0c;大家紛紛想體驗它的魅力。但隨著熱度的攀升&#xff0c…

Docker運行postgreSQL,由于異常啟動或者退出后,提示could not locate a valid checkpoint record

pg_resetwal 是 PostgreSQL 的“急救工具”&#xff0c;用于在極端情況下修復因 WAL 或控制文件損壞導致的啟動問題。 但需注意&#xff1a; 風險極高&#xff0c;可能導致數據不一致。必須立即轉儲并恢復&#xff0c;避免直接在修復后的數據庫中執行寫操作。僅在備份后使用&…