07-后端Web實戰(部門管理)

5. 修改部門

對于任何業務的修改功能來說,一般都會分為兩步進行:查詢回顯、修改數據。

5.1 查詢回顯

5.1.1 需求

當我們點擊 "編輯" 的時候,需要根據ID查詢部門數據,然后用于頁面回顯展示。

5.1.2 接口描述

參照參照課程資料中提供的接口文檔。 部門管理 -> 根據ID查詢

5.1.3 思路分析

明確了根據ID查詢部門的需求之后,再來梳理一下實現該功能時,三層架構每一層的職責:

了解了需求之后,我們再看看接口文檔中,關于根據ID查詢部門的接口的描述,然后根據接口文檔進行服務端接口的開發 。

5.1.4 路徑參數接收

/depts/1/depts/2 這種在url中傳遞的參數,我們稱之為路徑參數。 那么如何接收這樣的路徑參數呢 ?

路徑參數:通過請求URL直接傳遞參數,使用{…}來標識該路徑參數,需要使用 @PathVariable獲取路徑參數。如下所示:

如果路徑參數名與controller方法形參名稱一致,@PathVariable注解的value屬性是可以省略的。

5.1.5 代碼實現

1). Controller層

DeptController 中增加 getById方法,具體代碼如下:

/*** 根據ID查詢 - GET http://localhost:8080/depts/1*/
@GetMapping("/depts/{id}")
public Result getById(@PathVariable Integer id){System.out.println("根據ID查詢, id=" + id);Dept dept = deptService.getById(id);return Result.success(dept);
}

2). Service層

DeptService 中增加 getById方法,具體代碼如下:

/*** 根據id查詢部門*/
Dept getById(Integer id);

DeptServiceImpl 中增加 getById方法,具體代碼如下:

public Dept getById(Integer id) {return deptMapper.getById(id);
}

3). Mapper層

DeptMapper 中增加 getById 方法,具體代碼如下:

/**
* 根據ID查詢部門數據
*/
@Select("select id, name, create_time, update_time from dept where id = #{id}")
Dept getById(Integer id);

代碼編寫完畢之后,我們就可以啟動服務,進行測試了。

5.2 修改數據

5.2.1 需求

查詢回顯回來之后,就可以對部門的信息進行修改了,修改完畢之后,點擊確定,此時,就需要根據ID修改部門的數據。

了解了需求之后,我們再看看接口文檔中,關于修改部門的接口的描述,然后根據接口文檔進行服務端接口的開發 。

5.2.2 接口描述

參照參照課程資料中提供的接口文檔。 部門管理 -> 修改部門

5.2.3 思路分析

參照接口文檔,梳理三層架構每一層的職責:

通過接口文檔,我們可以看到前端傳遞的請求參數是json格式的請求參數,在Controller的方法中,我們可以通過 @RequestBody 注解來接收,并將其封裝到一個對象中。

5.2.4 代碼實現

1). Controller層

DeptController 中增加 update 方法,具體代碼如下:

/*** 修改部門 - PUT http://localhost:8080/depts  請求參數:{"id":1,"name":"研發部"}*/
@PutMapping("/depts")
public Result update(@RequestBody Dept dept){System.out.println("修改部門, dept=" + dept);deptService.update(dept);return Result.success();
}

2). Service層

DeptService 中增加 update 方法。

/*** 修改部門*/
void update(Dept dept);

DeptServiceImpl 中增加 update 方法。 由于是修改操作,每一次修改數據,都需要更新updateTime。所以,具體代碼如下:

public void update(Dept dept) {//補全基礎屬性dept.setUpdateTime(LocalDateTime.now());//保存部門deptMapper.update(dept);
}

3). Mapper層

DeptMapper 中增加 update 方法,具體代碼如下:

/*** 更新部門*/
@Update("update dept set name = #{name},update_time = #{updateTime} where id = #{id}")
void update(Dept dept);

代碼編寫完畢之后,我們就可以啟動服務,進行測試了。

修改完成之后,我們可以看到最新的數據,如下:

5.2.5 @RequestMapping

到此呢,關于基本的部門的增刪改查功能,我們已經實現了。 我們會發現,我們在 DeptController 中所定義的方法,所有的請求路徑,都是 /depts 開頭的,只要操作的是部門數據,請求路徑都是 /depts 開頭。

那么這個時候,我們其實是可以把這個公共的路徑 /depts 抽取到類上的,那在各個方法上,就可以省略了這個 /depts 路徑。 代碼如下:

一個完整的請求路徑,應該是類上的 @RequestMapping 的value屬性 + 方法上的 @RequestMapping的value屬性。

6. 日志技術

6.1 概述

  • 什么是日志?
    • 日志就好比生活中的日記,可以隨時隨地記錄你生活中的點點滴滴。
    • 程序中的日志,是用來記錄應用程序的運行信息、狀態信息、錯誤信息的。
  • 為什么要在程序中記錄日志呢?
    • 便于追蹤應用程序中的數據信息、程序的執行過程。
    • 便于對應用程序的性能進行優化。
    • 便于應用程序出現問題之后,排查問題,解決問題。
    • 便于監控系統的運行狀態。
    • ... ...
  • 之前我們編寫程序時,也可以通過 System.out.println(...) 來輸出日志,為什么我們還要學習單獨的日志技術呢?

這是因為,如果通過 System.out.println(...) 來記錄日志,會存在以下幾點問題:

  • 硬編碼。所有的記錄日志的代碼,都是硬編碼,沒有辦法做到靈活控制,要想不輸出這個日志了,只能刪除掉記錄日志的代碼。
  • 只能輸出日志到控制臺。
  • 不便于程序的擴展、維護。

所以,在現在的項目開發中,我們一般都會使用專業的日志框架,來解決這些問題。

6.2 日志框架

  • JUL:這是JavaSE平臺提供的官方日志框架,也被稱為JUL。配置相對簡單,但不夠靈活,性能較差。
  • Log4j:一個流行的日志框架,提供了靈活的配置選項,支持多種輸出目標。
  • Logback:基于Log4j升級而來,提供了更多的功能和配置選項,性能由于Log4j。
  • Slf4j(Simple Logging Facade for Java)簡單日志門面,提供了一套日志操作的標準接口及抽象類,允許應用程序使用不同的底層日志框架。

6.3 Logback入門

1). 準備工作:引入logback的依賴(springboot中無需引入,在springboot中已經傳遞了此依賴)

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.4.11</version>
</dependency>

2). 引入配置文件 logback.xml (資料中已經提供,拷貝進來,放在 src/main/resources 目錄下; 或者直接AI生成)

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 控制臺輸出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度  %msg:日志消息,%n是換行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern></encoder></appender><!-- 日志輸出級別 --><root level="ALL"><appender-ref ref="STDOUT" /></root>
</configuration>

3). 記錄日志:定義日志記錄對象Logger,記錄日志

public class LogTest {//定義日志記錄對象private static final Logger log = LoggerFactory.getLogger(LogTest.class);@Testpublic void testLog(){log.debug("開始計算...");int sum = 0;int[] nums = {1, 5, 3, 2, 1, 4, 5, 4, 6, 7, 4, 34, 2, 23};for (int i = 0; i < nums.length; i++) {sum += nums[i];}log.info("計算結果為: "+sum);log.debug("結束計算...");}}

運行單元測試,可以在控制臺中看到輸出的日志,如下所示:

我們可以看到在輸出的日志信息中,不僅輸出了日志的信息,還包括:日志的輸出時間、線程名、具體在那個類中輸出的。

6.4 Logback配置文件

Logback日志框架的配置文件叫 logback.xml

該配置文件是對Logback日志框架輸出的日志進行控制的,可以來配置輸出的格式、位置及日志開關等。

常用的兩種輸出日志的位置:控制臺、系統文件。

1). 如果需要輸出日志到控制臺。添加如下配置:

<!-- 控制臺輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化輸出:%d 表示日期,%thread 表示線程名,%-5level表示級別從左顯示5個字符寬度,%msg表示日志消息,%n表示換行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern></encoder>
</appender>

2). 如果需要輸出日志到文件。添加如下配置:

<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 日志文件輸出的文件名, %i表示序號 --><FileNamePattern>D:/tlias-%d{yyyy-MM-dd}-%i.log</FileNamePattern><!-- 最多保留的歷史日志文件數量 --><MaxHistory>30</MaxHistory><!-- 最大文件大小,超過這個大小會觸發滾動到新文件,默認為 10MB --><maxFileSize>10MB</maxFileSize></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化輸出:%d 表示日期,%thread 表示線程名,%-5level表示級別從左顯示5個字符寬度,%msg表示日志消息,%n表示換行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern></encoder>
</appender>

3). 日志開關配置 (開啟日志(ALL),取消日志(OFF))

<!-- 日志輸出級別 -->
<root level="ALL"><!--輸出到控制臺--><appender-ref ref="STDOUT" /><!--輸出到文件--><appender-ref ref="FILE" />
</root>

6.5 Logback日志級別

日志級別指的是日志信息的類型,日志都會分級別,常見的日志級別如下(優先級由低到高):

表格 還在加載中,請等待加載完成后再嘗試復制

可以在配置文件logback.xml中,靈活的控制輸出那些類型的日志。(大于等于配置的日志級別的日志才會輸出)

<!-- 日志輸出級別 -->
<root level="info"><!--輸出到控制臺--><appender-ref ref="STDOUT" /><!--輸出到文件--><appender-ref ref="FILE" />
</root>

6.6 案例日志記錄

/*** 部門管理控制器*/
@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {@Autowiredprivate DeptService deptService;/*** 查詢部門列表*///@RequestMapping(value = "/depts", method = RequestMethod.GET)@GetMappingpublic Result list(){//System.out.println("查詢部門列表");log.info("查詢部門列表");List<Dept> deptList = deptService.findAll();return Result.success(deptList);}/*** 根據id刪除部門 - delete http://localhost:8080/depts?id=1*/@DeleteMappingpublic Result delete(Integer id){//System.out.println("根據id刪除部門, id=" + id);log.info("根據id刪除部門, id: {}" , id);deptService.deleteById(id);return Result.success();}/*** 新增部門 - POST http://localhost:8080/depts   請求參數:{"name":"研發部"}*/@PostMappingpublic Result save(@RequestBody Dept dept){//System.out.println("新增部門, dept=" + dept);log.info("新增部門, dept: {}" , dept);deptService.save(dept);return Result.success();}/*** 根據ID查詢 - GET http://localhost:8080/depts/1*/@GetMapping("/{id}")public Result getById(@PathVariable Integer id){//System.out.println("根據ID查詢, id=" + id);log.info("根據ID查詢, id: {}" , id);Dept dept = deptService.getById(id);return Result.success(dept);}/*** 修改部門 - PUT http://localhost:8080/depts  請求參數:{"id":1,"name":"研發部"}*/@PutMappingpublic Result update(@RequestBody Dept dept){//System.out.println("修改部門, dept=" + dept);log.info("修改部門, dept: {}" , dept);deptService.update(dept);return Result.success();}
}

lombok中提供的@Slf4j注解,可以簡化定義日志記錄器這步操作。添加了該注解,就相當于在類中定義了日志記錄器,就下面這句代碼:

private static Logger log = LoggerFactory. getLogger(Xxx. class);

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

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

相關文章

深度解析項目集方向或目標根本性轉變的應對策略 —— 項目集管理實戰指南

在復雜多變的商業環境中&#xff0c;項目集管理面臨著重重挑戰&#xff0c;而項目集方向或目標的根本性轉變無疑是其中最具沖擊力的問題之一。本文將深度剖析這一難題&#xff0c;為項目集管理從業者提供實用、新穎且富有價值的應對策略&#xff0c;助力大家在項目集管理的復雜…

JAVA面試復習知識點

面試中遇到的題目&#xff0c;記錄復習&#xff08;持續更新&#xff09; Java基礎 1.String的最大長度 https://www.cnblogs.com/wupeixuan/p/12187756.html 2.集合 Collection接口的實現&#xff1a; List接口&#xff1a;ArraryList、LinkedList、Vector Set接口&#xff1a…

【燒腦算法】定長滑動窗口:算法題中的“窗口”智慧

目錄 引言 定長滑動窗口習題剖析 3439. 重新安排會議得到最多空余時間 I 2134. 最少交換次數來組合所有的 1 II 1297. 子串的最大出現次數 2653. 滑動子數組的美麗值 567. 字符串的排列 438. 找到字符串中所有字母異位詞 30. 串聯所有單詞的子串 220. 存在重復元素 II…

JWT安全:接收無簽名令牌.【簽名算法設置為none繞過驗證】

JWT安全&#xff1a;假密鑰【簽名隨便寫實現越權繞過.】 JSON Web 令牌 (JWT)是一種在系統之間發送加密簽名 JSON 數據的標準化格式。理論上&#xff0c;它們可以包含任何類型的數據&#xff0c;但最常用于在身份驗證、會話處理和訪問控制機制中發送有關用戶的信息(“聲明”)。…

XGBoost與SHAP深度解析:從算法原理到實戰價值

在機器學習領域&#xff0c;XGBoost以其卓越的性能長期占據Kaggle競賽和工業界的主流地位&#xff0c;而SHAP&#xff08;SHapley Additive exPlanations&#xff09;則成為模型可解釋性的標桿工具。本文將深度解析兩者的技術內核&#xff0c;并通過實戰案例揭示其結合應用的實…

Java SE Cloneable接口和深/淺拷貝

Java為我們提供了各種各樣功能的接口&#xff0c;Clonable接口就是其中之一。 它通常配合Object類的 clone方法使用。這個方法可以為我們創建一個對象的拷貝&#xff0c;即復制一個對象。在進入本文的主要內容之前&#xff0c;先來對訪問限定符 protected進行一個解剖。 1.再…

Python學習(3) ----- Python的函數定義及其使用

Python 中函數是組織好的、可重復使用的代碼塊&#xff0c;用于實現單一或相關聯的功能。下面是函數定義和使用的完整說明&#xff1a; &#x1f4cc; 一、函數定義語法 def 函數名(參數1, 參數2默認值, *args, **kwargs):"""函數說明文檔"""函…

vue2使用el-tree實現兩棵樹間節點的拖拽復制

原文鏈接&#xff1a;兩棵el-tree的節點跨樹拖拽實現 參照這篇文章&#xff0c;把它做成組件&#xff0c;新增左側樹&#xff08;可拖出&#xff09;被拖節點變灰提示&#xff1b; 拖拽中&#xff1a; 拖拽后&#xff1a; TreeDragComponent.vue <template><!-- …

智變與重構:AI 賦能基礎教育教學的范式轉型研究報告

一、研究背景與核心價值 &#xff08;一&#xff09;技術驅動下的教育轉型浪潮 在全球數字化轉型加速的背景下&#xff0c;人工智能作為核心技術力量&#xff0c;正重塑基礎教育生態。據《人工智能賦能未來教育研究報告》指出&#xff0c;我國教育數字化戰略行動已推動超 70…

Go語言中Print、Printf和Println的區別及使用場景詳解

在Go語言的fmt包中&#xff0c;Print、Printf和Println是三個基礎但功能各異的輸出函數。本文將從多個維度進行詳細對比分析&#xff0c;并給出具體的使用建議。 1. 核心區別深度解析 1.1. 函數簽名與基本行為 func Print(a ...interface{}) (n int, err error) func Printf…

高端制造行業 VMware 替代案例合集:10+ 頭部新能源、汽車、半導體制造商以國產虛擬化支持 MES、PLM 等核心應用系統

在“中國制造 2025”政策的推動下&#xff0c;國內的新能源、汽車制造、半導體、高端裝備等高端制造產業迎來了蓬勃發展&#xff0c;成為全球制造業版圖中舉足輕重的力量。訂單數量的激增與國產化轉型的趨勢&#xff0c;也為高端制造企業的 IT 基礎設施帶來了新的挑戰&#xff…

Spring Ai | 從零帶你一起走進AI項目(中英)

目錄 Thinking Study question pox.xml Maven Gradle Configure API Key Use the AI Client Question Thinking 讓數據變得更加貼近用戶的想法 Study question null pox.xml 添加依賴 Maven <dependencies><dependency><groupId>org.springfram…

LiveGBS作為下級平臺GB28181國標級聯2016|2022對接海康大華宇視華為政務公安內網等GB28181國標平臺查看級聯狀態及會話

LiveGBS作為下級平臺GB28181國標級聯2016|2022對接海康大華宇視華為政務公安內網等GB28181國標平臺查看級聯狀態及會話 1、GB/T28181級聯概述2、搭建GB28181國標流媒體平臺3、獲取上級平臺接入信息3.1、向下級提供信息3.2、上級國標平臺添加下級域3.3、接入LiveGBS示例 4、配置…

卸載 Office PLUS

Office PLUS作為微軟官方推出的智能辦公提效工具&#xff0c;自2015年問世以來&#xff0c;憑借其豐富的模板資源和便捷的智能功能&#xff0c;迅速贏得了廣大職場人士和學生的青睞。本文將全面介紹Office PLUS的發展歷程、核心功能、可能帶來的使用問題&#xff0c;以及如何徹…

影響沉金價格的因素如何體現在多層電路板制造上?

隨著科技的不斷發展&#xff0c;電子產品越來越普及&#xff0c;對電路板的需求也越來越大。多層電路板作為電子產品的核心部件&#xff0c;其性能和質量直接影響到整個產品的穩定性和可靠性。在多層電路板的生產過程中&#xff0c;沉金工藝是一種常用的表面處理方法&#xff0…

擴展摩爾投票法:找出出現次數超過 n/3 的元素

文章目錄 問題描述關鍵洞察算法原理Java 實現算法演示投票階段驗證階段 復雜度分析算法關鍵點通用化公式實際應用場景邊界情況處理總結 標簽&#xff1a;LeetCode 169, 摩爾投票法, 多數元素, 算法擴展, 數組處理 在解決多數元素問題時&#xff0c;我們學習了經典的摩爾投票法處…

Git:現代軟件開發的基石——原理、實踐與行業智慧·優雅草卓伊凡

Git&#xff1a;現代軟件開發的基石——原理、實踐與行業智慧優雅草卓伊凡 一、Git的本質與核心原理 1. 技術定義 Git是一個分布式版本控制系統&#xff08;DVCS&#xff09;&#xff0c;由Linus Torvalds在2005年為管理Linux內核開發而創建。其核心是通過快照&#xff08;Sna…

程序人生-hello’s P2P

計算機系統 大作業 題 目 程序人生-hello’s P2P 專 業 計算機與電子通信類 學   號 2023111990 班   級 23L0514 學 生 袁騁 指 導 教 師 史…

Java設計模式之設計原則

Java設計模式 Java設計模式主要原則是開閉原則&#xff0c;即對擴展開放&#xff0c;對修改關閉。由此衍生出5大原則&#xff1a;單一職責原則&#xff0c;里式替換原則&#xff0c;迪米特原則&#xff0c;接口隔離職責&#xff0c;依賴倒置原則。1、開閉原則 開閉原則&#x…

使用 ssld 提取CMS 簽名并重簽名

拿SpringBoard的cms簽名和entitlements.xml&#xff0c;對tihook.dylib進行重簽名 工具來源&#xff1a;https://github.com/eksenior/ssld