分層-三層架構

文章目錄

  • 介紹
  • 代碼拆分
    • Dao層
    • server層
    • controller層
  • 運行結果

介紹

在我們進行程序設計以及程序開發時,盡可能讓每一個接口、類、方法的職責更單一些(單一職責原則)。
單一職責原則:一個類或一個方法,就只做一件事情,只管一塊功能。這樣就可以讓類、接口、方法的復雜度更低,可讀性更強,擴展性更好,也更利于后期的維護。
從組成上看可以分為三個部分:

  • 數據訪問:負責業務數據的維護操作,包括增、刪、改、查等操作。
  • 邏輯處理:負責業務邏輯處理的代碼。
  • 請求處理、響應數據:負責,接收頁面的請求,給頁面響應數據。

按照上述的三個組成部分,在我們項目開發中呢,可以將代碼分為三層:

  • Controller:控制層。接收前端發送的請求,對請求進行處理,并響應數據。
  • Service:業務邏輯層。處理具體的業務邏輯。
  • Dao:數據訪問層(Data Access Object),也稱為持久層。負責數據訪問操作,包括數據的增、刪、改、查。

三層架構的程序執行流程:

  • 前端發起的請求,由Controller層接收(Controller響應數據給前端)
  • Controller層調用Service層來進行邏輯處理(Service層處理完后,把處理結果返回給Controller層)
  • Serivce層調用Dao層(邏輯處理過程中需要用到的一些數據要從Dao層獲取)
  • Dao層操作文件中的數據(Dao拿到的數據會返回給Service層)

代碼拆分

Dao層

創建UserDao接口

package com.example.Dao;import java.util.List;public interface UserDao {/*** 加載用戶數據* @return*/public List<String> findAll();
}

創建UserDaoImpl接口,實現文件操作

package com.example.Dao.impl;import cn.hutool.core.io.IoUtil;
import com.example.Dao.UserDao;import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;public class UserDaoImpl implements UserDao {@Overridepublic List<String> findAll() {//加載并讀取user.txtInputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList<>());return lines;}
}

server層

創建UserSerivce接口

package com.example.service;import com.example.pojo.User;import java.util.List;public interface UserService {/*** 查詢所有用戶信息* @return*/public List<User> findAll();
}

創建UserSerivceImpl接口,實現數據操作,返回對象

package com.example.service.impl;import com.example.Dao.UserDao;
import com.example.Dao.impl.UserDaoImpl;
import com.example.pojo.User;
import com.example.service.UserService;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;public class UserServiceImpl implements UserService {private UserDao userDao = new UserDaoImpl();@Overridepublic List<User> findAll() {//調用Dao獲取數據List<String> lines = userDao.findAll();//解析用戶信息,封裝List<User> userList = lines.stream().map(line -> {String[] parts = line.split(",");Integer id = Integer.parseInt(parts[0]);String username = parts[1];String password = parts[2];String name = parts[3];Integer age = Integer.parseInt(parts[4]);LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id, username, password, name, age, updateTime);}).toList();//返回return userList;}
}

controller層

創建UserController類

@RestController
public class UserController {private UserService userService = new UserServiceImpl();@RequestMapping("/list")public List<User> list() throws Exception{List<User> userList = userService.findAll();//返回json數據return userList;}
}

運行結果

目錄
在這里插入圖片描述
運行并訪問
在這里插入圖片描述

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

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

相關文章

Vue2 VS Vue3

vue3 是的&#xff0c;Vue 3 確實取消了基于 JavaScript 原型的 Vue 和 VueComponent 構造函數&#xff08;即你提到的 vm 和 vc&#xff09;&#xff0c;取而代之的是一種完全不同的、基于普通對象和代理&#xff08;Proxy&#xff09;的實例管理方式。 這是一個顛覆性的改變…

Vue3入門到實戰,最新版vue3+TypeScript前端開發教程,Vue3簡介,筆記02

筆記02 一、Vue3簡介 1.1、Vue3發布日期&#xff1a; 2020年9月18日 1.2、Vue3做了哪些升級&#xff1a; 1.2.1、性能的提升 官方發版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 打包大小減少41%初次渲染快55%更新渲染快133%內容減少54% 1.2.2、源碼的優化…

.net core webapi/mvc阿里云服務器部署 - 錯誤解決

錯誤及解決方案缺少web.config配置HTTP 錯誤 500.19 - Internal Server Error檢查 IIS 配置1. 確保 .NET Core Hosting Bundle 已安裝2. 檢查 應用程序池 配置3. 檢查 IIS MIME 類型檢查文件權限1. 確保 IIS 用戶 有權限訪問網站目錄2. 檢查 web.config 文件權限啟用詳細錯誤日…

多輸入(input)多輸出(output)驗證

#作者&#xff1a;程宏斌 文章目錄前言Flb 1.9.4 INCLUDE配置測試測試方案測試配置文件測試命令Flb 3.0.2 INCLUDE配置測試測試方案測試配置文件啟動命令結論結論一&#xff1a;結論二&#xff1a;前言 需要設計并執行一組測試用例&#xff0c;這些測試用例將包括以子文件形式…

行業學習【電商】:垂直電商如何理解?以專業寵物平臺為例

聲明&#xff1a;以下部分內容含AI生成 “寵物等愛好者的專業平臺”指的是垂直電商的一個具體例子。 “垂直電商” 就是指不賣所有東西&#xff0c;只深耕某一個特定領域&#xff08;即“垂直”領域&#xff09;的電商平臺。 “寵物愛好者的專業平臺”就是這樣一個專門為養寵…

GPT(Generative Pre-trained Transformer)模型架構與損失函數介紹

目錄 一、核心架構&#xff1a;Transformer Decoder 1. 核心組件&#xff1a;僅解碼器&#xff08;Decoder-Only&#xff09;的堆疊 2. 輸入表示&#xff1a;Token 位置 3. 輸出 二、訓練過程&#xff1a;兩階段范式 階段一&#xff1a;預訓練&#xff08;Pre-training&…

GitHub 熱榜項目 - 日榜(2025-09-10)

GitHub 熱榜項目 - 日榜(2025-09-10) 生成于&#xff1a;2025-09-10 統計摘要 共發現熱門項目&#xff1a;15 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現三大技術熱點&#xff1a;LLM智能體應用爆發&#xff08;如parlant、AutoAgent&#xff09;&a…

論文閱讀:arxiv 2023 Large Language Models are Not Stable Recommender Systems

總目錄 大模型相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://arxiv.org/pdf/2312.15746 速覽 破解大語言模型在推薦系統中的不穩定性 該論文聚焦于大語言模型&#xff08;LLMs&#xff09;在推薦系統中的應用問題&#xff0c;指出…

Linux的使用——FinalShell下載使用及連接云服務器的教程

一、注冊免費阿里云服務器 1. 進入阿里云服務器官網 阿里云-計算&#xff0c;為了無法計算的價值https://www.aliyun.com/?spm5176.ecscore_server.console-base_top-nav.dlogo.39144df5uvPLOm 2. 點擊免費試用 這里我已經試用過了&#xff0c;大家選擇合適的云服務器點擊立…

如何清理 Docker 占用的巨大磁盤空間

我相信很多人在使用 Docker 一段時間后&#xff0c;都會遇到一個常見問題&#xff1a;磁盤空間被迅速吃光&#xff0c;尤其是在進行頻繁的鏡像構建、測試和運行容器時。以我自己為例&#xff0c;在 Ubuntu 24.04設備上&#xff0c;docker system df -v 一看&#xff0c;Docker …

【CMake】緩存變量

目錄 一. 緩存變量 二.創建緩存變量 2.1.使用set()來創建緩存變量 2.2.使用FORCE參數來覆蓋緩存變量 2.2.1.示例1——不帶force的set是不能覆蓋已經存在的緩存變量的 2.2.2.示例2——帶force的set才能覆蓋已經存在的緩存變量 2.2.3.對比示例 2.3.命令行 -D 創建/覆蓋緩…

vue2使用若依框架動態新增tab頁并存儲之前的tab頁的操作

1. 應用場景&#xff1a;點擊歷史記錄&#xff0c;要比較兩個tab頁的內容時&#xff0c;需要做到切換tab頁來回看左右對數據對比。2.開發難點若依項目正常是把路由配置到菜單管理里&#xff0c;都是設定好的。不過它也給我們寫好了動態新增tab頁的方&#xff0c;需要我們自己來…

論文閱讀-SelectiveStereo

文章目錄1 概述2 模塊2.1 SelectiveIGEV和IGEV的差異2.2 上下文空間注意力2.2.1 通道注意力2.2.2 空間注意力2.3 SRU3 效果參考資料1 概述 本文主要結合代碼對Selective的創新點進行針對性講解&#xff0c;相關的背景知識可以參考我寫的另兩篇文章論文閱讀-RaftStereo和論文閱…

深入分析神馬 M56S+ 202T 礦機參數與性能特點

引言在比特幣&#xff08;BTC&#xff09;和比特幣現金&#xff08;BCH&#xff09;等主流加密貨幣的挖掘過程中&#xff0c;礦機的選擇直接關系到挖礦的效率與收益。神馬 M56S 202T礦機是SHA-256算法的礦機&#xff0c;憑借其強大的算力和高效的能效比&#xff0c;成為了礦工們…

36.2Linux單總線驅動DS18B20實驗(詳細講解代碼)_csdn

想必看過我很多次博客的同學&#xff0c;都知道了編寫驅動的流程&#xff01; 這里我們還是按照以前的習慣來一步一步講解&#xff01; 單總線驅動&#xff0c;在F103和51單片機的裸機開發中是經常見的。 linux驅動代碼編寫實際上就是&#xff0c;端對端的編程&#xff01; 就是…

【雜類】應對 MySQL 處理短時間高并發的請求:緩存預熱

一、什么是緩存預熱&#xff1f;1. 核心概念??緩存預熱&#xff08;Cache Warm-up&#xff09;?? 是指在系統??正式對外提供服務之前??&#xff0c;或??某個高并發場景來臨之前??&#xff0c;??主動??將后續極有可能被訪問的熱點數據從數據庫&#xff08;MySQL…

點評項目(Redis中間件)第三部分短信登錄,查詢緩存

可以直接看后面Redis實現功能的部分基于session實現短信登錄發送短信驗證碼前端請求樣式業務層代碼Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {Overridepublic Result sendCode(String phone, HttpSession se…

線性方程求解器的矩陣分裂

大概思路是對的&#xff0c;但是查老師可能會出現幻覺&#xff0c;小心食用 &#x1f603;這段代碼是在初始化迭代法求解器&#xff0c;構建迭代矩陣和分裂矩陣。以下是詳細解釋&#xff1a; if init_from_func or init_from_input:# 1. 存儲剛度矩陣self.stiff_p stiff_p# 2.…

【Beetle RP2350】雷達模塊 CEM5861G-M11 開發使用指南

一、硬件介紹 1、產品特點 Beetle RP2350【RP2350A_QFN60】是一款基于RP2350微控制器的高性能迷你開發板&#xff0c;雙核雙架構設計&#xff08;支持 Arm Cortex-M33或Hazard3 RISC-V內核&#xff09;為開發者提供靈活的性能配置。 雙核雙架構&#xff0c;性能自由切換 采…

高通Android 13 開機黑屏問題深度剖析與解決方案

1. 問題概述 在 Android 13 系統定制化開發過程中&#xff0c;開機流程的調試與優化頗具挑戰性。一個典型問題是&#xff1a;當開機動畫播放完畢后&#xff0c;設備會先出現數秒黑屏&#xff0c;然后才進入鎖屏界面。本文基于開機日志分析&#xff0c;結合實際項目經驗&#x…