銀川網(wǎng)站建設(shè)哪家好手機(jī)優(yōu)化大師下載安裝
目錄
1.DTO/VO/PO
2.MVC架構(gòu)/微服務(wù)架構(gòu)
3.JWT令牌流程
4.ThreadLocal
5.接口路徑/路徑參數(shù)
1.DTO/VO/PO
1.1 DTO
DTO 即 Data Transfer Object——?數(shù)據(jù)傳輸對象,是用于傳輸數(shù)據(jù)的對象,通常在服務(wù)層與表現(xiàn)層之間傳遞數(shù)據(jù),DTO 通常用于減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,因為它只包含需要傳遞的數(shù)據(jù),而不包含業(yè)務(wù)邏輯。DTO 常用于不同服務(wù)或系統(tǒng)之間的數(shù)據(jù)交換。
public class UserDTO {private String id;private String username;private String email;// 可能還包含其他的傳輸相關(guān)字段// Getters and Setters
}
1.2 VO
VO 即 Value Object-——值對象,VO 通常在表示層(如前端)使用,表示一個具體的業(yè)務(wù)場景中的數(shù)據(jù)結(jié)構(gòu),可能是多個領(lǐng)域?qū)ο蠡驅(qū)嶓w對象的組合。
public class UserVO {private String username;private String displayName;// 可能包含一些展示相關(guān)的信息,比如角色、權(quán)限等// Getters and Setters
}
1.3 PO
PO 即?Persistent Object——持久化對象,PO 是與數(shù)據(jù)庫表結(jié)構(gòu)一一對應(yīng)的 Java 對象,用于表示數(shù)據(jù)庫中的一行記錄。特點:
- 直接映射到數(shù)據(jù)庫表結(jié)構(gòu),通常對應(yīng)于數(shù)據(jù)庫中的一張表
- 包含數(shù)據(jù)庫字段的所有屬性
- 可能包括一些與數(shù)據(jù)庫相關(guān)的注解或映射信息
@Entity
@Table(name = "users")
public class UserPO {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username")private String username;@Column(name = "password")private String password;@Column(name = "email")private String email;// Getters and Setters
}
三者的工作流程:
- 從數(shù)據(jù)庫到業(yè)務(wù)邏輯:在系統(tǒng)需要從數(shù)據(jù)庫中獲取數(shù)據(jù)時,通過 DAO 層獲取 PO 對象,將其從數(shù)據(jù)庫加載到內(nèi)存
- 業(yè)務(wù)層處理:如果業(yè)務(wù)邏輯復(fù)雜或者需要傳遞給其他服務(wù)時,將 PO 轉(zhuǎn)換成 DTO 或 VO 對象進(jìn)行傳輸,以減少依賴性和安全風(fēng)險。
- 傳輸?shù)娇蛻舳?#xff1a;DTO 將業(yè)務(wù)層處理后的數(shù)據(jù)傳輸?shù)娇刂破鲗?#xff0c;最終封裝為 API 響應(yīng)返回給客戶端。
- 從客戶端到數(shù)據(jù)庫:客戶端提交的數(shù)據(jù)通過控制器層接收后轉(zhuǎn)換為 DTO 或 VO,再經(jīng)業(yè)務(wù)邏輯處理后轉(zhuǎn)化為 PO,最終將數(shù)據(jù)保存至數(shù)據(jù)庫。
總結(jié):
- PO:用于數(shù)據(jù)庫交互,直接與數(shù)據(jù)庫表結(jié)構(gòu)相關(guān)
- DTO:用于跨層傳輸數(shù)據(jù),通常為精簡版或安全版的數(shù)據(jù)結(jié)構(gòu)
- VO:用于業(yè)務(wù)邏輯,封裝系統(tǒng)內(nèi)的不可變數(shù)據(jù)
2.MVC架構(gòu)/微服務(wù)架構(gòu)
MVC架構(gòu)和微服務(wù)架構(gòu)是兩種不同層次的架構(gòu)模式,MVC是一種應(yīng)用內(nèi)的架構(gòu)模式,主要用于組織單個應(yīng)用程序的代碼邏輯,而微服務(wù)是一種系統(tǒng)級的架構(gòu)模式,用于將一個大型應(yīng)用分解成多個可獨立部署的服務(wù)。
具體來說,MVC(Model-View-Controller)是一種常見的軟件架構(gòu)模式,用于將應(yīng)用程序分為三個主要部分:模型(Model)、視圖(View)和控制器(Controller)。這種分層結(jié)構(gòu)幫助組織代碼,提高應(yīng)用的可維護(hù)性和擴(kuò)展性。
Model負(fù)責(zé)處理應(yīng)用程序的核心數(shù)據(jù)邏輯。它包含應(yīng)用程序的數(shù)據(jù)結(jié)構(gòu)和業(yè)務(wù)邏輯,直接與數(shù)據(jù)庫進(jìn)行交互,并進(jìn)行數(shù)據(jù)的增刪改查操作。
View負(fù)責(zé)呈現(xiàn)數(shù)據(jù)給用戶,是用戶與應(yīng)用程序交互的界面。視圖的主要目的是展示數(shù)據(jù),但不包含業(yè)務(wù)邏輯。
Controller是模型和視圖之間的橋梁,負(fù)責(zé)處理用戶輸入并協(xié)調(diào)模型和視圖的工作??刂破鲝囊晥D接收用戶輸入,將其解釋為對模型的操作。
3.JWT令牌流程
4.ThreadLocal
客戶端每次發(fā)送的請求都屬于單獨的一個線程(最小單位,進(jìn)程是軟件),所以如果想要在一個請求中獲取信息就可以通過ThreadLoacl。ThreadLocal 并不是一個Thread(線程),而是Thread的局部變量。ThreadLocal為每個線程提供單獨一份存儲空間,具有線程隔離的效果,只有在線程內(nèi)才能獲取到對應(yīng)的值,線程外則不能訪問。ThreadLocal常用方法:
- public void set(T vare)? 設(shè)置當(dāng)前線程的線程局部變量的值
- public T get()??返回當(dāng)前線程所對應(yīng)的線程局部變量的值
- public void remove()??移除當(dāng)前線程的線程局部變量
當(dāng)然,往往使用ThreadLocal的時候都會簡單地封裝成一個工具類:
public class BaseContext {public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();public static void setCurrentId(Long id) {threadLocal.set(id);}public static Long getCurrentId() {return threadLocal.get();}public static void removeCurrentId() {threadLocal.remove();}}
5.接口路徑/路徑參數(shù)
在Java后端開發(fā)中,接口路徑和路徑參數(shù)是指向服務(wù)器資源和處理請求數(shù)據(jù)的重要概念,接口路徑是API中一個特定的URL地址,用于定位資源或功能,例如:
https://example.com/api/users
:其中/api/users
就是接口路徑,表示訪問用戶資源的接口
在Java后端開發(fā)中,接口路徑通常由控制器(Controller)類來定義。例如在Spring框架中,可以使用@RequestMapping
、@GetMapping
等注解來指定路徑,例如下面的代碼中,/api/users
就是getAllUsers()
方法的接口路徑
@RestController
@RequestMapping("/api")
public class UserController {@GetMapping("/users")public List<User> getAllUsers() {// 邏輯代碼}
}
路徑參數(shù)是URL路徑中的動態(tài)部分,通常用于識別特定資源。路徑參數(shù)使用{}
括起來,并且會在方法中被解析并綁定。例如:
https://example.com/api/users/123
:其中123
就是路徑參數(shù),表示要訪問ID為123
的用戶資源
假設(shè)我們有一個電商系統(tǒng),需要獲取特定商品的詳細(xì)信息。可以使用路徑參數(shù)來標(biāo)識商品的ID:接口路徑定義為:/api/products/{productId},
如果要獲取ID為888的商品信息,客戶端會發(fā)起以下請求:
GET https://example.com/api/products/101
在Spring框架中,我們可以用@PathVariable
注解來捕獲這個路徑參數(shù):
@RestController
@RequestMapping("/api/products")
public class ProductController {@GetMapping("/{productId}")public Product getProductById(@PathVariable("productId") Long productId) {// 假設(shè)我們從數(shù)據(jù)庫獲取商品信息Product product = productService.findProductById(productId);return product;}
}
{productId}
是路徑參數(shù)占位符@PathVariable("productId")
把URL中的productId
參數(shù)提取出來,并賦值給方法參數(shù)productId
- 當(dāng)請求
GET /api/products/101
到達(dá)時,Spring會自動將路徑中的101
賦值給productId
,然后在getProductById
方法中使用這個值來獲取商品信息
再舉一個例子,要寫一個啟用禁用員工賬號的接口,接口路徑+路徑參數(shù)為/status/{status}
@PostMapping("/status/{status}")
@ApiOperation("啟用禁用員工賬號")
public Result startOrStop(@PathVariable("status") Integer status, Long id){employeeService.startorstpp(status,id);return Result.success();
}