Java Web 學習之路(2) —— 概念、SpringBoot + MyBatis(controller+service+mapper)開發流程與過程梳理

文章目錄

  • 前言
  • 1. 常見的一些概念
    • 1.1 POJO(Plain Ordinary Java Object 簡單Java對象)
    • 1.2 DAO和Mapper
  • 2. Java的三層架構
    • 2.1 包的層級結構
    • 2.2 交互層 controller(用戶界面、網頁)jsp文件
    • 2.3 業務處理層 service
    • 2.4 Mapper層
  • 3. 注解
    • 3.1 @SpringBootApplication
    • 3.2 Bean對象的聲明
    • 3.3 @Autowired
    • 3.4 @RequestBody
    • 3.5 @ResponseBody
    • 3.6 @PathVariable
    • 3.7 @RequestParam
    • 3.8 @RequestMapping、@GetMapping、@@PostMapping等等
    • 3.9 @Configuration
    • 3.10 @Import
    • 3.11 @Bean
    • 3.12 @Transactional
    • 3.13 切面
    • 3.14 @Slf4j
    • 3.15 lombok
  • 總結

前言

這段時間在繼續沉淀Java后端的東西,看的網課是黑馬的23版JavaWeb開發,整體只是把很多知識點過了一遍,發現好多知識點都不明白,加之前面基礎不牢,整體感受就是面向注解編程,感覺整個人就稀里糊涂。做完了這個Demo后,我也打算來好好整理一下目前的知識點。

最大的一個感覺就是Java的生態圈是真的龐大,這也是為啥這么多年了Java仍然能在國內市場當老大的原因吧。

1. 常見的一些概念

1.1 POJO(Plain Ordinary Java Object 簡單Java對象)

POJO就是一個非常簡單的對象,一般只包含一些基本的參數,一般就用來表示數據結構,例如數據庫中的表結構。

POJO的內在含義是指:那些沒有繼承任何類、也沒有實現任何接口,更沒有被其它框架侵入的java對象。
它僅包含自身的屬性以及自身屬性的getter和setter方法,這意味者POJO可以方便的從一個框架遷移到另一個框架中,或者框架升級也會對代碼毫無影響,因此而得到復用。

Bean

Bean是POJO的特殊類型,所有的Java Bean都是POJO。

  • JavaBean是遵循特定編寫規范的Java類,主要用于封裝數據。具體來說,一個JavaBean需要滿足以下規范:實現Serializable接口以支持序列化;提供一個無參構造函數;使用私有屬性存儲數據,并提供公共的getter和setter方法訪問和修改這些屬性;對于值類型的屬性,使用私有屬性存儲數據;對于引用類型的屬性,使用私有屬性存儲對對象的引用,并提供公共的getter和setter方法訪問和修改這些引用。

  • 相比之下,POJO(Plain Ordinary Java Object)是一種更純凈、簡單的Java類或接口。它嚴格地遵守簡單對象的概念,也就是說,POJO主要用于裝載數據,作為數據存儲的載體,而不具有業務邏輯處理的能力。與JavaBean不同,POJO沒有嚴格的編寫規范,只要它包含屬性和相應的getter和setter方法,就可以被視為POJO

(以上資料來自GPT)

1.2 DAO和Mapper

DAO通常是一個接口,它定義了一些數據訪問方法,而具體的實現則由其他類來完成;而Mapper則是用于將Java對象與SQL語句進行映射的,它通常是一個XML文件,包含了一些SQL語句和一些與Java對象相關的配置信息。

2. Java的三層架構

Java設計三層架構主要目的還是分層解耦。
在這里插入圖片描述

  • 控制反轉:簡稱IOC。對象的創建控制權由程序自身轉移到外部(容器),這種思想被稱為控制反轉。
  • 依賴注入:簡稱DI。容器為應用程序提供運行時,所依賴的資源,稱之為依賴注入。
  • Bean對象:IOC容器中創建、管理的對象,稱之為Bean。

2.1 包的層級結構

Java開發的包的層級特別多也特別深,在之前我自己做C++開發的時候,都沒有過這種感覺。

這里主要用的是Maven,也是目前最流行的打包方式。
在這里插入圖片描述

2.2 交互層 controller(用戶界面、網頁)jsp文件

controller層作為與前端交互的層,主要用來接受請求,并且調用業務層service層。

@Slf4j  // 自動生成一個名為log的日志對象
@RequestMapping("/depts")
@RestController // 包含ResponseBody注解,將返回對象直接轉為json再響應回來(controller層必要的注解)
public class DeptController {@Autowired	// 自動裝配注解,是用來將這個注解下面的對象進行實例化的private DeptService deptService;	// 調用業務邏輯層需要聲明相應的業務邏輯層對象/*** 查詢部門數據* @return*/@GetMappingpublic Result list() {log.info("查詢全部部門數據");// 調用service查詢部門數據List<Dept> deptList = deptService.list();return Result.success(deptList);}@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id) {	// 前端需要傳遞的參數log.info("根據id刪除部門:{}", id);deptService.delete(id);return Result.success();}
}

2.3 業務處理層 service

主要作用是:與交互層進行數據傳輸,調用數據處理層,完成各種業務功能。

首先要有個業務層接口,然后再有實現類。

public interface DeptService {/*** 查詢全部部門數據* @return*/List<Dept> list();/*** 刪除部門* @param id*/void delete(Integer id);/*** 新增部門* @param dept*/void add(Dept dept);
}
@Service	// 這個注解來表明這是個業務邏輯層,到時候自動裝配就可以找到這個層
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;@Autowiredprivate EmpMapper empMapper;@Overridepublic List<Dept> list() {return deptMapper.list();}@Override@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)  // spring事務管理;默認只有RuntimeException才回滾;這里指定所有異常public void delete(Integer id) {deptMapper.deleteById(id);
//        int i = 1 / 0;empMapper.deleteByDeptId(id);   // 根據部門id刪除員工}@Overridepublic void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setUpdateTime(LocalDateTime.now());deptMapper.insert(dept);}
}

2.4 Mapper層

這一層就是進行數據庫的操作了。在這一層,spring有DAO和Mapper兩種實現,一般后者用的多一點。

@Mapper	// Mapper層要有的東西
public interface DeptMapper {/*** 查詢全部部門數據* @return*/@Select("select * from dept")List<Dept> list();@Delete("delete from dept where id = #{id}")void deleteById(Integer id);@Insert("insert into dept (name, create_time, update_time) values(#{name}, #{createTime}, #{updateTime})")void insert(Dept dept);
}

關于Mapper層和Service層,前者主要負責和數據庫打交道,而Service層更多則是業務邏輯的處理,包括事務的添加也在這一層,比如從A扣掉100,再從B加上100,這個過程在Service層打包成了一個事務。

3. 注解

初次學習的時候,接觸了太多的注解了,一方面感慨java后端就是面向注解編程,可以幫助我們快速構建應用程序;另一方面覺得對底層認值還不夠清晰。這一小節把常用的注解都記錄下來總結一下。

3.1 @SpringBootApplication

作用:這是一個組合注解,包括了@Configuration、@EnableAutoConfiguration和@ComponentScan三個注解。用于標識SpringBoot應用程序的入口類。

  • @Configuration:指示這個類是一個配置類,它定義了一個或多個@Bean方法,用于創建和配置Spring應用程序上下文中的Bean。

  • @EnableAutoConfiguration:啟用Spring Boot的自動配置機制,它會自動添加所需的依賴項和配置,以使應用程序能夠運行。

  • @ComponentScan:指示Spring Boot掃描當前包及其子包中的所有@Component、@Service、@Repository和@Controller注解的類,并將它們注冊為Spring Bean。

@SpringBootApplication注解通常被用于Spring Boot應用程序的入口類上,用于啟動Spring Boot應用程序。它可以簡化Spring應用程序的配置和啟動過程。

3.2 Bean對象的聲明

作用:把某個對象交給IOC容器管理。即完成控制反轉。

注解說明位置
@Component聲明bean的基礎注解不屬于以下三類時,用此注解
@Controller@Component的衍生注解標注在控制器類上
@Service@Component的衍生注解標注在業務類上
@Mapper@Component的衍生注解標注在Mapper上

在springboot中,控制類用@RestController,該類不僅包含了@Controller,還可以將返回值類轉換為json類型給前端。

3.3 @Autowired

作用:用于自動裝配Spring容器中的Bean。即完成依賴注入。

3.4 @RequestBody

作用:用于將HTTP請求的主體轉換為方法的參數。@RequestBody是Spring MVC框架中的一個注解,用于將HTTP請求體中的數據綁定到控制器方法的參數上需要注意,后端pojo類的參數名要與傳入的參數名一致。

@RestController
@RequestMapping("/api")
public class UserController {@PostMapping("/users")public User createUser(@RequestBody User user) {// 創建用戶}
}

3.5 @ResponseBody

作用:用于將方法的返回值轉換為HTTP響應的主體。@ResponseBody是Spring MVC框架中的一個注解,用于將控制器方法的返回值轉換為HTTP響應體中的數據。

3.6 @PathVariable

作用:用于獲取URL中的參數值。@PathVariable是Spring MVC框架中的一個注解,用于將HTTP請求路徑中的變量綁定到控制器方法的參數上。

@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id) {log.info("根據id刪除部門:{}", id);deptService.delete(id);return Result.success();
}

3.7 @RequestParam

作用:用于獲取請求參數的值,如果未聲明則參數和變量參數名一樣;同時還可以用defaultValue設置默認值。

@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize,String name, Short gender,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {log.info("分頁查詢,參數:{}, {}", page, pageSize);PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);return Result.success(pageBean);
}

3.8 @RequestMapping、@GetMapping、@@PostMapping等等

用于處理HTTP的各種請求。

3.9 @Configuration

作用:用于標識一個類是Spring的配置類。@Configuration是Spring框架中的一個注解,用于標注一個類作為配置類。

3.10 @Import

作用:用于導入其他配置類或Bean。

3.11 @Bean

作用:用于將一個方法返回的對象注冊到Spring容器中。@Bean是Spring框架中的一個注解,用于將一個方法返回的對象注冊為一個Spring Bean。

3.12 @Transactional

作用:用于指定事務的范圍。

3.13 切面

@Aspect

作用:用于定義切面。

@Aspect是Spring框架中的一個注解,用于標識一個類為切面類,從而可以在該類中定義切面邏輯以實現AOP(面向切面編程)。

在Spring框架中,如果需要使用AOP來實現某些功能,我們可以使用@Aspect注解來標識一個類為切面類。在切面類中,我們可以定義切面邏輯,包括切入點、通知類型和切面順序等,從而實現AOP編程的功能。

同時,我們還使用@Component注解標識這個類,以便Spring框架能夠自動將它加入到Spring容器中。

@Pointcut

作用:用于定義切點。

@Pointcut是Spring框架中的一個注解,用于定義一個切入點,從而可以在該切入點上定義通知類型以實現AOP(面向切面編程)。

在Spring框架中,如果需要使用AOP來實現某些功能,我們可以使用@Pointcut注解來定義一個切入點。在切入點上,我們可以定義切面邏輯,包括通知類型和切面順序等,從而實現AOP編程的功能。
@Pointcut("execution(* com.example.UserService.*(..))")

@Before
作用:用于在方法執行前執行通知。
@After
作用:用于在方法執行后執行通知。
@Around
作用:用于在方法執行前后執行通知。

3.14 @Slf4j

作用:用于簡化日志記錄。

3.15 lombok

@Data
作用:用于自動生成JavaBean的getters、setters、toString、hashCode和equals方法。
@NoArgsConstructor
作用:用于生成無參構造函數。
@AllArgsConstructor
作用:用于生成全參構造函數。


總結

感覺學到這雖說把后端的框架都拉通了一遍,但也只是淺嘗輒止。后續還需要做更多的研究才行,未來的安排是通過做黑馬的項目和背八股文來加深理解。今天把這篇博客寫完也算是對這段時間的學習進行了一個總結,然后就準備回家休息幾天了。

References

java三層架構,有圖有案例有代碼,一看就懂!!!
SpringBoot最常用的50個注解(全是干貨,干的要死!)

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

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

相關文章

如何同步fork項目原倉庫的更新

最簡單粗暴的方法&#xff1a;把原來fork的倉庫刪了重新fork&#xff08;嘿嘿不過這顯然是不優雅的&#xff09; 那我們該怎么同步更新呢&#xff1f; 如何在 Github 網頁端同步更新&#xff1f; 進入你自己的 fork 過來的倉庫。點擊 “Pull requests” &#xff0c;如何點擊…

2024 年甘肅省職業院校技能大賽信息安全管理與評估賽項規程

2024 年甘肅省職業院校技能大賽高職學生組電子與信息大類信息安全管理與評估賽項規程 一、賽項名稱 賽項名稱&#xff1a;信息安全管理與評估 賽項類別&#xff1a;團體賽 賽項歸屬&#xff1a;電子與信息大類 二、競賽目的 極安云科專注技能競賽&#xff0c;包含網絡建設…

Python基礎——正則匹配中高階用法

1.正則使用變量匹配re.escape() re.escape() 是一個用于轉義正則表達式中特殊字符的函數。當我們需要使用變量構建正則表達式模式時&#xff0c;為了避免特殊字符對模式的解析產生影響&#xff0c;我們可以使用 re.escape() 函數來自動轉義這些特殊字符。 例如&#xff0c;如…

微信小程序css實現的聯系客服動畫樣式

一 、效果 二、代碼 wxml <view class"customer-service"><button class"btn" open-type"contact"></button><image class"pic" src"https://ts4.cn.mm.bing.net/th?idOIP-C.3SGSiRPuOU9uH5VNVOMPwgHaHa…

序列的Z變換(信號的頻域分析)

1. 關于Z變換 2. 等比級數求和 3. 特殊序列的Z變換 4. 因果序列/系統收斂域的特點 5. 例題

navigationBar頂部導航欄,兼容適配所有機型(附完整案例)

思路 隱藏原生樣式獲取膠囊按鈕、狀態欄相關數據以供后續計算根據不同機型計算出該機型的導航欄高度,進行適配編寫為導航欄公共組件使用組件1. 隱藏原生樣式 全局設置 "window": {"navigationStyle": "custom" }單個頁面設置 {"navigat…

免費的AI文案生成器有哪些?AI文案生成器排行榜

在當今數字化的時代&#xff0c;內容創作已成為許多行業不可或缺的一部分。為了滿足日益增長的創作需求&#xff0c;越來越多的人開始尋找能夠提高效率、同時保持原創性的解決方案。本文將專心分享一些優質的AI文案生成器。 AI文案生成器的需求 內容創作已經不再是傳統媒體和市…

高項備考葵花寶典-項目進度管理輸入、輸出、工具和技術(上,很詳細考試必過)

項目進度管理的目標是使項目按時完成。有效的進度管理是項目管理成功的關鍵之一&#xff0c;進度問題在項目生命周期內引起的沖突最多。 小型項目中&#xff0c;定義活動、排列活動順序、估算活動持續時間及制定進度模型形成進度計劃等過程的聯系非常密切&#xff0c;可以視為一…

C語言基礎

常量和常量表達式的區別 #define N 4;又是常量&#xff0c;又是常量表達式&#xff0c;其在編譯期預處理階段就會直接替換 const int M 5;只是常量&#xff0c;不是常量表達式 &#xff0c;其是存儲在一塊內存區域之內的&#xff0c;但是存儲的值不能改變 常量表達式&#xff…

【USB、串口、COM口、TTL、RS-232、RS-485區別詳解】

USB&#xff0c;串口&#xff0c;COM口&#xff0c;TTL&#xff0c;RS-232&#xff0c;RS-485區別詳解 1. USB&#xff0c;串口&#xff0c;COM口&#xff0c;TTL&#xff0c;RS-232&#xff0c;RS-485區別詳解2 USB轉TTL2 RS-232轉TTL3 USB4 UART5 STM32串口異步通訊需要定義的…

iOS——定位與地圖

平時在寫項目的時候可能會遇到需要使用定位服務的地方&#xff0c;比如說獲取位置和導航等。因此這里我會使用OC自帶的庫以及蘋果系統的地圖來獲取定位以及顯示在地圖上。 開始前的設置 在獲取定位前&#xff0c;需要在項目文件的info中添加兩個關鍵字&#xff0c;用于向用戶…

從零開始的C++(二十一)

C11 1.列表初始化&#xff1a; //允許以下代碼正確運行int a[]{1,2,3};//效果與int a[]{1,2,3}一致 即允許省略等于號。同時&#xff0c;允許用花括號對所有自定義類型和內置類型進行初始化&#xff0c;而非以前花括號只能對數組進行初始化。利用花括號對自定義類型初始化時…

LeetCode刷題--- 求根節點到葉節點數字之和

個人主頁&#xff1a;元清加油_【C】,【C語言】,【數據結構與算法】-CSDN博客 個人專欄&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;這個專欄主要講述遞歸遞歸、搜索與回溯算法&#xff0c;所以下面題目主要也是這些算法做的 我講述…

【ITK庫學習】使用itk庫進行圖像濾波ImageFilter:鄰域濾波

目錄 1、itkMeanImageFilter 均值濾波器2、itkMedianImageFilter 中值濾波器3、itkBinaryMedianImageFilter 二值中值濾波器4、擴展itkNeighborhood5、擴展itkNeighborhoodIterator6、擴展itkNeighborhoodOperator 領域濾波是一種信號處理方法&#xff0c;用于去除信號中的噪聲…

★560. 和為 K 的子數組(自己做出來了)

560. 和為 K 的子數組 前綴和的知識。 如果要求i~j下標之間的元素和&#xff0c;用前綴和的話&#xff0c;應該是b[j] - b[i-1]&#xff0c;i處的值也應該包括。 所以這個題&#xff0c;前綴和數組就要比原數組整體向后平移一個單元格&#xff0c;不然在求0~n的和的時候沒法取…

在python中安裝庫,會有conda安裝,也會有pip安裝,conda與pip的區別是什么?

文章目錄 一、Conda是什么&#xff1f;二、pip是什么&#xff1f;三、pip與conda的區別&#xff1a;總結 一、Conda是什么&#xff1f; Conda是一個開源的包管理系統&#xff0c;它是Anaconda公司為Python和其他編程語言開發的。它主要用于數據科學和機器學習領域&#xff0c;…

【Vue】日常錯誤總結(持續更新)

日常遇到的小問題匯總, 內容小篇幅少的就全放這里了, 內容多的會在Vue專欄單獨分享~ 目錄 【Q】 el-form-item值為 null 或 undefined顯示““ 【Q】dialog內組件數據刷新總是延遲慢一拍 問題背景描述 解決方案 代碼簡單模擬 JS 【Q】el-input 不能輸入的解決辦法 方法…

Educational Codeforces Round 156 (Rated for Div. 2)補題

Sum of Three 題目大意&#xff1a;將一個正整數n分成3個不同的正整數x,y,z,保證三個數都不能整除3&#xff0c;如果無法實現就輸出NO. 思路&#xff1a;這個題實際上特別簡單&#xff0c;我們可以發現當n比較大的時候&#xff0c;我們可以從中取1&#xff0c;然后第二個數也…

【Java】Java環境以及EditPlus編輯器安裝與配置流程

要安裝和配置Java環境以及EditPlus編輯器&#xff0c;請按照以下步驟操作&#xff1a; ### 安裝Java Development Kit (JDK) 1. 訪問Java官方網站下載最新版本的JDK。 2. 運行下載的JDK安裝程序&#xff0c;并按照提示完成安裝。 3. 安裝完成后&#xff0c;記下JDK的安裝路徑&a…

perf與火焰圖-性能分析工具

參考鏈接 perf性能分析工具使用分享 如何讀懂火焰圖&#xff1f;-阮一峰 perf基本用法-record,report-知乎 火焰圖抓取 準備&#xff1a; centos安裝perf工具 dnf install perf下載火焰圖解析代碼 git clone https://github.com/brendangregg/FlameGraph.git抓取指定進程…