前后端分離實戰2----后端

戳我抵達前端

項目描述:用Vscode創建Spring Boot+mybatis項目,用maven進行管理。創建一個User表,對其內容進行表的基本操作(增刪改查),顯示在前端。

項目地址:戳我一鍵下載項目

運行效果如下:

項目目錄:

核心代碼講解:

1.UserController.java

package improv1.improv1;
import improv1.improv1.MybatisConnect.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/user")
public class UserController {// 新增用戶@PostMapping("/add")public Map<String, Object> addUser(@RequestParam String name, @RequestParam String email) {Map<String, Object> result = new HashMap<>();if (name == null || email == null) {result.put("error", "參數不足,需提供 name 和 email");return result;}try (SqlSession session = MyBatisUtil.getSqlSession()) {UserMapper mapper = session.getMapper(UserMapper.class);Map<String, Object> params = new HashMap<>();params.put("name", name);params.put("email", email);params.put("createTime", LocalDateTime.now());int rows = mapper.insertUser(params);session.commit();result.put("message", "新增成功");result.put("rows", rows);result.put("id", params.get("id"));} catch (Exception e) {result.put("error", e.getMessage());}return result;}// 查詢所有用戶@GetMapping("/list")public List<Map<String, Object>> getAllUsers() {try (SqlSession session = MyBatisUtil.getSqlSession()) {UserMapper mapper = session.getMapper(UserMapper.class);return mapper.getAllUsers();}}// 更新用戶@PostMapping("/update")public Map<String, Object> updateUser(@RequestParam Integer id,@RequestParam String name,@RequestParam String email) {Map<String, Object> result = new HashMap<>();if (id == null || name == null || email == null) {result.put("error", "參數不足,需提供 id、name、email");return result;}try (SqlSession session = MyBatisUtil.getSqlSession()) {UserMapper mapper = session.getMapper(UserMapper.class);Map<String, Object> params = new HashMap<>();params.put("id", id);params.put("name", name);params.put("email", email);int rows = mapper.updateUser(params);session.commit();result.put("message", "更新成功");result.put("rows", rows);} catch (Exception e) {result.put("error", e.getMessage());}return result;}// 刪除用戶@PostMapping("/delete")public Map<String, Object> deleteUser(@RequestParam Integer id) {Map<String, Object> result = new HashMap<>();if (id == null) {result.put("error", "請提供要刪除的用戶ID");return result;}try (SqlSession session = MyBatisUtil.getSqlSession()) {UserMapper mapper = session.getMapper(UserMapper.class);int rows = mapper.deleteUser(id);session.commit();result.put("message", "刪除成功");result.put("rows", rows);} catch (Exception e) {result.put("error", e.getMessage());}return result;}
}

解析:

操作數據庫表一般把對一張表的操作寫在一個文件里。

Spring Boot項目把文件寫成controller,默認會部署到tomcat,可以通過htttp://localhost:8080/映射地址來訪問。這里的映射地址是由前綴+映射子地址組成的,在這里若要查詢表映射地址為/user/list。若要刪除表,完整的地址是htttp://localhost:8080/user/delete剩下的以此類推。

2.mybatis框架應用部分

如果要在spring Boot項目里用mybatis框架管理表,首先,要在resources目錄下建立mapper文件夾,在里面編寫,數據庫表對應的mapper.xml文件。可以在resouces根目錄下編寫mybatis-config.xml文件。

當然,最好不要編寫mybatis-config文件,在application.properties里填寫相關數據庫信息進行統一管理比較好。接著,在pom.xml文件里加入Spring Boot和mybatis以及數據庫相關依賴。

最后,在項目里編寫mapper.xml對應的操作數據庫表接口文件,對表進行操作。

一般要添加的pom.xml內容如下:

	<!-- Spring boot配置mybatis -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version></dependency><!-- 配置mysql數據庫--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency><!-- 配置spring boot--></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

1)UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="improv1.improv1.UserMapper"><!-- 插入用戶 --><insert id="insertUser" parameterType="map">INSERT INTO user(name, email, create_time)VALUES(#{name}, #{email}, #{createTime})</insert><!-- 刪除用戶 --><delete id="deleteUser" parameterType="int">DELETE FROM user WHERE id = #{id}</delete><!-- 更新用戶 --><update id="updateUser" parameterType="map">UPDATE user SETname = #{name},email = #{email}WHERE id = #{id}</update><!-- 查詢所有用戶 --><select id="getAllUsers" resultType="map">SELECT id, name, email, create_time as createTimeFROM user</select>
</mapper>

解析:

? 其中INSERT INTO user(name, email, create_time)
? ? ? ? VALUES(#{name}, #{email}, #{createTime})這里的user(屬性)和values(#{屬性}),要保持一致。id與mapper.xml對應的操作類方法名對應一致

2)UserMapper.java

package improv1.improv1;
import java.util.List;
import java.util.Map;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("improv1.improv1")
public interface UserMapper {// 使用Map作為參數int insertUser(Map<String, Object> params);int deleteUser(int id);int updateUser(Map<String, Object> params);List<Map<String, Object>> getAllUsers();
}

解析:

1.這里的MapperScan的作用是用于自動掃描和注冊 MyBatis 的 Mapper 接口。如果不配置,可能就會報錯找不到mapper。

2.這里的getAllUsers返回的結果要進行接受顯示,所以我們把返回類型用List數組來接收,每一個元素都是鍵值對的形式對應數據庫表里的每一行數據。

3)application.properties

spring.application.name=improv1
# 數據庫連接配置
spring.datasource.url=jdbc:mysql://localhost:3306/mybaitistest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=improv1.improv1 # 你的實體類包名
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl

解析:

mybatis.type-aliases-package=improv1.improv1 這里配置的就是操作數據庫表的類所在包的位置。

3.CorsConfig.java

package improv1.improv1;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class CorsConfig {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("*").allowedHeaders("*").allowCredentials(true);}};}
}

解析:

這段代碼是一個Spring Boot的CORS(跨域資源共享)配置類,用于全局配置跨域請求。主要功能包括:

  • 允許所有路徑(/**)的跨域請求
  • 允許所有來源(allowedOriginPatterns("*")
  • 允許所有HTTP方法(allowedMethods("*")
  • 允許所有請求頭(allowedHeaders("*")
  • 允許攜帶憑證(allowCredentials(true))如果不寫,就可能會引發瀏覽器訪問受阻,訪問失敗報200錯誤。其實這些配置也可以寫在application.properties里面,但是這樣這種方式只適用于簡單場景,且部分老版本 Spring Boot 可能不支持。如果你需要更細粒度的控制(如只允許部分接口、部分域名),還是建議使用?Java 配置類。

擴展:

1.postMapper和getMapper的區別

定義與用途?postMapper通常指代處理HTTP POST請求的映射器,用于接收客戶端提交的數據(如表單、JSON等),適用于數據修改或新增操作。getMapper則對應HTTP GET請求的映射器,用于獲取資源,適合數據查詢場景。

數據傳遞方式?postMapper通過請求體(body)傳輸數據,數據在HTTP包體中,適合傳輸大量或敏感信息。getMapper通過URL參數傳遞數據,數據附加在URL后,長度受限且可見。

安全性?postMapper相對更安全,數據不直接暴露在URL中,適合密碼等敏感信息。getMapper參數明文顯示在URL,可能被日志或瀏覽器歷史記錄留存。

冪等性?getMapper具有冪等性,多次執行同一請求不會改變資源狀態。postMapper通常是非冪等的,重復提交可能導致多次資源變更。

2.@RequestMapping("/user")是什么怎么用

作用與含義

  • 路徑映射:將特定 URL 路徑(如?/user)與控制器(Controller)類或方法綁定。
  • 請求處理:當客戶端請求匹配該路徑時,Spring 會調用對應的控制器方法處理請求。

使用方法

類級別注解

標注在控制器類上,定義該控制器所有方法的公共路徑前綴:

@Controller
@RequestMapping("/user")
public class UserController {// 方法實際路徑為 /user/profile@RequestMapping("/profile")public String profile() {return "profile";}
}
方法級別注解

標注在具體方法上,定義獨立路徑:

@Controller
public class UserController {// 直接響應 /login 路徑@RequestMapping("/login")public String login() {return "login";}
}
組合使用

類注解定義前綴,方法注解補充子路徑:

@RestController
@RequestMapping("/api/user")
public class UserApiController {// 完整路徑為 /api/user/info@GetMapping("/info")public UserInfo getInfo() {return userService.getInfo();}
}
支持的屬性

可通過額外屬性進一步定義請求匹配規則:

@RequestMapping(value = "/create",method = RequestMethod.POST,consumes = "application/json",produces = "application/json"
)
常見派生注解
  • @GetMapping:等價于?@RequestMapping(method = RequestMethod.GET)
  • @PostMapping:等價于?@RequestMapping(method = RequestMethod.POST)
  • @PutMapping/@DeleteMapping?等同理

該注解是 Spring Web 開發的核心配置方式,合理使用可實現清晰的 URL 路由結構。

3.mapper.xml中的id是怎么用的

id 的作用

在 MyBatis 的映射文件(XML 文件)中,id?是?<insert>?標簽的一個屬性,用于唯一標識該 SQL 語句。id?的主要作用是讓 MyBatis 能夠通過它找到對應的 SQL 語句并執行。

id 的用途

id?與 Mapper 接口中的方法名一一對應。例如,如果 Mapper 接口中有一個方法名為?insertUser,那么在映射文件中,<insert>?標簽的?id?也必須是?insertUser,這樣才能正確關聯接口方法與 SQL 語句。

使用方法

  1. 定義 Mapper 接口
    在 Mapper 接口中聲明一個方法,方法名與映射文件中的?id?一致。

    public interface UserMapper {int insertUser(User user);
    }
  2. 在映射文件中配置 SQL
    映射文件中的?<insert>?標簽的?id?必須與接口方法名相同。

    <insert id="insertUser" parameterType="map">INSERT INTO user(name, email, create_time)VALUES(#{name}, #{email}, #{createTime})
    </insert>
  3. 調用方法
    通過 MyBatis 的 SqlSession 或 Mapper 代理對象調用接口方法,MyBatis 會根據?id?找到對應的 SQL 并執行。

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    Map<String, Object> params = new HashMap<>();
    params.put("name", "John");
    params.put("email", "john@example.com");
    params.put("createTime", new Date());
    userMapper.insertUser(params);

注意事項

  • id?必須在同一個命名空間(namespace)內唯一,不能重復。
  • id?的值應與 Mapper 接口中的方法名嚴格匹配,否則會導致 MyBatis 無法找到對應的 SQL 語句。
  • 如果使用注解方式(如?@Insert),則無需在 XML 中配置?id,但方法名仍需與 SQL 邏輯對應。

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

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

相關文章

深入 ARM-Linux 的系統調用世界

1、引言 本篇文章以 ARM 架構為例&#xff0c;進行講解。需要讀者有一定的 ARM 架構基礎 在操作系統的世界中&#xff0c;系統調用&#xff08;System Call&#xff09;是用戶空間與內核空間溝通的橋梁。用戶態程序如 ls、cp 或你的 C 程序&#xff0c;無權直接操作硬件、訪問文…

LabVIEW鍵盤鼠標監測控制

通過Input Device Control VIs&#xff0c;實現對鍵盤和鼠標活動的監測。通過AcquireInput Data VI 在循環中持續獲取輸入數據&#xff0c;InitializeKeyboard與InitializeMouse VIs 先獲取設備ID 引用&#xff0c;用于循環內監測操作&#xff1b;運行時可輸出按鍵信息&#xf…

Linux 系統管理:自動化運維與容器化部署

在現代 IT 基礎設施中&#xff0c;自動化運維和容器化部署是提高系統管理效率和可維護性的關鍵。Linux 系統因其穩定性和靈活性而被廣泛應用于服務器和數據中心。本文將深入探討 Linux 系統管理中的自動化運維和容器化部署技術&#xff0c;幫助系統管理員實現高效運維和快速部署…

直播 APP 開發需要多少成本

直播行業的火爆催生了大量直播 APP 開發需求&#xff0c;而開發成本是開發者最關注的問題之一。其成本構成復雜&#xff0c;受功能需求、開發方式、技術難度等多種因素影響。? 基礎功能開發是成本的重要組成部分。用戶注冊登錄、直播間創建與管理、視頻播放、聊天互動等功能開…

Reactor操作符的共享與復用

在 Reactor 中&#xff0c;transform 和 transformDeferred 是兩個用于代碼復用和操作符鏈封裝的高級操作符。它們允許你將一組操作符封裝成一個函數&#xff0c;并在適當的時候應用到響應式流中。以下是它們的詳細總結&#xff1a; 1. transform 操作符 作用&#xff1a;tran…

C#中的Converter詳解

Converter是C#中一個非常有用的概念&#xff0c;主要用于類型轉換。它通常以委托或接口的形式出現&#xff0c;允許開發者定義如何將一種類型轉換為另一種類型。下面我將詳細介紹Converter的概念、使用場景&#xff0c;并以布爾型轉換為例展示具體應用。 Converter的基本概念 …

LabVIEW熒光微管圖像模擬

利用LabVIEW平臺&#xff0c;集成 PI 壓電平臺、Nikon 熒光顯微鏡及Andor sCMOS 相機等硬件&#xff0c;構建熒光微管滑行實驗圖像序列模擬系統。通過程序化模擬微管運動軌跡、熒光標記分布及顯微成像過程&#xff0c;為生物醫學領域微管跟蹤算法測試、運動特性分析提供標準化仿…

CentOS下Nginx服務器搭建全攻略

Nginx 安裝與配置完整指南 一、安裝 Nginx 1.1 添加 Nginx 官方倉庫 在 CentOS 系統中&#xff0c;默認倉庫的 Nginx 版本可能較舊&#xff08;通常為 1.12 或更早版本&#xff09;&#xff0c;建議添加官方倉庫來安裝最新穩定版本&#xff08;目前為 1.25.x&#xff09;&am…

網絡拓撲圖繪制全流程:從架構解析到工具實戰

在數據呈現與系統管理中&#xff0c;清晰展示設備間的邏輯關系至關重要。網絡拓撲圖正是這樣一種有效的可視化工具。它通過節點設備和連接線路&#xff0c;直觀呈現網絡結構或項目流程中各元素的布局與交互關系&#xff0c;幫助理解系統運作、診斷問題并確保項目順利進行。 1. …

Git 簡介安裝教程

&#x1f4e2;歡迎點贊&#x1f44d;收藏?留言&#x1f4dd;如有錯誤敬請指正&#xff01; 目錄 一、Git 的安裝1.1 Git 的下載1.2 Git 的安裝1.2.1 使用許可聲明1.2.2 選擇安裝目錄1.2.3 選擇安裝組件1.2.4 選擇開始菜單文件夾1.2.5 選擇 Git 默認編輯器1.2.6 決定初始化新項…

鴻蒙NEXT-鴻蒙三層架構搭建,嵌入HMRouter,實現便捷跳轉,新手攻略。(2/3)

在上一小節我們已經完成了關于三層架構的搭建&#xff0c;接下來我們來實現在三層架構中的導入依賴&#xff0c;將他們相互聯系起來。 第一步&#xff1a;在features產品定制層中&#xff0c;對其中所有的動態共享包導入依賴&#xff0c;示例features>my>oh-package.jso…

【每天一個知識點】語料投毒(Corpus Poisoning)

“語料投毒”&#xff08;Corpus Poisoning&#xff09; 是指攻擊者通過向大型語言模型&#xff08;如 ChatGPT&#xff09;使用的外部知識庫中注入惡意或誤導性文檔&#xff0c;從而干擾模型的檢索與回答過程&#xff0c;導致其輸出錯誤、虛假或有害內容。 &#x1f50d; 舉個…

疏通經脈: Bridge 聯通邏輯層和渲染層

本節概述 經過前面兩節的開發&#xff0c;我們已經完成了小程序邏輯線程和 UI 線程的啟動引擎準備&#xff0c;這節開始&#xff0c;我們將完善 native bridge 層的搭建&#xff0c;構建起邏輯線程和UI線程之間的橋梁。 開始之前我們先來回顧一下邏輯引擎小節相關的流程圖: 一…

【攻防篇】解決:阿里云docker 容器中自動啟動xmrig挖礦

解決&#xff1a;阿里云服務器docker容器被植入挖礦程序 **1. 緊急處理&#xff1a;停止挖礦進程****&#xff08;1&#xff09;查找并終止 xmrig 進程****&#xff08;2&#xff09;刪除惡意文件** **2. 清理被感染的容器****&#xff08;1&#xff09;停止并刪除容器****&…

對稱非對稱加密,https和http,https通訊原理,Charles抓包原理

文章目錄 對稱加密的非對稱加密http和https原理TCP三次握手四次揮手https通訊流程&#xff1a;Charles抓包原理 對稱加密的非對稱加密 對稱加密&#xff1a;發送方的接收方式使用同一個秘鑰進行加密和解密&#xff0c;發送方將需要發送的數據&#xff0c;選擇某種加密算法&…

Kubernetes(K8s)_15_調度原理

文章目錄 Pod調度實現原理調度隊列優先隊列底層數據 調度緩存調度框架 Pod調度 Pod調度: 通過污點、容忍度和親和性影響Pod的調度 調度器實現, 其基于配置器構造(其配置來源于配置API)調度過程中任何插件返回拒絕, 都會導致Pod可能再次返回調度隊列 如: Pod調度簡略流程 調度…

moduo之tcp客戶端TcpClient

結構 #mermaid-svg-muvN6eOMXA4rCyXP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-muvN6eOMXA4rCyXP .error-icon{fill:#552222;}#mermaid-svg-muvN6eOMXA4rCyXP .error-text{fill:#552222;stroke:#552222;}#merm…

中國科技術語雜志中國科技術語雜志社中國科技術語編輯部2025年第3期目錄

理論研究 認知術語學與社會認知術語學比較研究 吳小芳; 3-11 大語言模型背景下的術語翻譯研究&#xff1a;現狀、問題與展望 朱玉彬;王梓; 12-20 航空事件謠言敘事中的術語初探 劉成盼;劉東亮; 21-28 定名研討 淺談訓詁、訓詁學和訓詁學術語 林童; 29-35 …

自然語言處理NLP期末復習

目錄 第一章1. NLP的基本過程包括哪些-自然語言處理面臨的困難是什么2. 自然語言處理算法定義&#xff0c;過程和應用3. 結合自己的研究-描述研究中涉及的自然語言處理模型或算法&#xff0c;模型或算法原理&#xff0c;具體的處理過程4. 自然語言處理的的兩大核心任務是5. 程序…

單片機 - STM32F103“復用功能重映射”完整解析:從JTAG釋放到TIM重映射實戰詳解

本文將詳細講解 STM32F103 系列中常見的“復用功能重映射”&#xff08;Remap&#xff09;機制&#xff0c;包括 JTAG 占用、引腳默認功能與復用功能的關系&#xff0c;以及如何通過寄存器或標準庫代碼實現重映射。以 TIM3 在 PB4/PB5 上輸出 PWM 為例&#xff0c;進行實戰講解…