Spring Boot + MyBatis + MySQL:快速搭建CRUD應用

一、引言

1. 項目背景與目標

在現代Web開發中,CRUD(創建、讀取、更新、刪除)操作是幾乎所有應用程序的核心功能。本項目旨在通過Spring Boot、MyBatis和MySQL技術棧,快速搭建一個高效、簡潔的CRUD應用。我們將從零開始,逐步實現一個用戶管理系統的增刪改查功能。

2. 技術選型與適用場景

  • Spring Boot:簡化了基于Spring的應用開發,提供了自動配置、嵌入式服務器等特性。
  • MyBatis:作為持久層框架,支持自定義SQL、存儲過程和高級映射,靈活性高。
  • MySQL:廣泛使用的開源關系型數據庫,性能穩定,社區活躍。

二、開發環境準備

1. 開發工具與依賴安裝

  • JDK:確保已安裝Java Development Kit(建議版本8及以上)。
  • Maven/Gradle:用于項目構建和依賴管理。
  • IDE:推薦使用IntelliJ IDEA或Eclipse。
  • MySQL:下載并安裝MySQL數據庫,配置好數據庫連接信息。

2. Spring Boot項目初始化

  • 使用 Spring Initializr 創建項目:
    • Project: Maven Project
    • Language: Java
    • Spring Boot: 最新穩定版本
    • Dependencies: Spring Web, MyBatis Framework, MySQL Driver

三、數據庫設計與初始化

1. MySQL數據庫表設計

創建一個簡單的用戶表user,包含以下字段:

CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,email VARCHAR(100),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. 數據初始化腳本

src/main/resources目錄下創建data.sql文件,插入一些測試數據:

INSERT INTO user (username, password, email) VALUES 
('admin', 'password123', 'admin@example.com'),
('user1', 'password123', 'user1@example.com');

配置application.yml中的數據庫連接信息:

spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver

四、Spring Boot與MyBatis集成

1. MyBatis基礎配置

application.yml中添加MyBatis配置:

mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.demo.entity

2. 實體類與Mapper接口開發

  • 實體類:創建User類表示用戶信息。

    package com.example.demo.entity;public class User {private Integer id;private String username;private String password;private String email;private Timestamp createdAt;// Getters and Setters
    }
    
  • Mapper接口:創建UserMapper接口及對應的XML映射文件。

    package com.example.demo.mapper;import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;@Mapper
    public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User findById(Integer id);
    }
    

    src/main/resources/mapper目錄下創建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="com.example.demo.mapper.UserMapper"><select id="findById" resultType="com.example.demo.entity.User">SELECT * FROM user WHERE id = #{id}</select>
    </mapper>
    

3. Service層與Controller層實現

  • Service層:封裝業務邏輯。

    package com.example.demo.service;import com.example.demo.entity.User;
    import com.example.demo.mapper.UserMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;@Service
    public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Integer id) {return userMapper.findById(id);}
    }
    
  • Controller層:提供RESTful API接口。

    package com.example.demo.controller;import com.example.demo.entity.User;
    import com.example.demo.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;@RestController
    public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users/{id}")public User getUser(@PathVariable Integer id) {return userService.getUserById(id);}
    }
    

五、CRUD功能實現

1. 創建(Create)功能

  • Mapper接口:添加插入數據的方法。

    @Insert("INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email})")
    void insertUser(User user);
    
  • Service層:實現新增用戶邏輯。

    public void createUser(User user) {userMapper.insertUser(user);
    }
    
  • Controller層:提供新增用戶的API接口。

    @PostMapping("/users")
    public void createUser(@RequestBody User user) {userService.createUser(user);
    }
    

2. 讀取(Read)功能

  • 分頁查詢:使用MyBatis分頁插件PageHelper。
    <select id="findAllUsers" resultType="com.example.demo.entity.User">SELECT * FROM user
    </select>
    
  PageHelper.startPage(pageNum, pageSize);List<User> users = userMapper.findAllUsers();PageInfo<User> pageInfo = new PageInfo<>(users);
  • 動態條件查詢:按用戶名模糊搜索。
    <select id="findUsersByUsername" resultType="com.example.demo.entity.User">SELECT * FROM user WHERE username LIKE CONCAT('%', #{username}, '%')
    </select>
    

3. 更新(Update)功能

  • Mapper接口:添加更新數據的方法。

    @Update("UPDATE user SET username=#{username}, password=#{password}, email=#{email} WHERE id=#{id}")
    void updateUser(User user);
    
  • Service層:實現更新用戶邏輯。

    public void updateUser(User user) {userMapper.updateUser(user);
    }
    
  • Controller層:提供更新用戶的API接口。

    @PutMapping("/users/{id}")
    public void updateUser(@PathVariable Integer id, @RequestBody User user) {user.setId(id);userService.updateUser(user);
    }
    

4. 刪除(Delete)功能

  • 硬刪除:直接從數據庫中刪除記錄。

    @Delete("DELETE FROM user WHERE id=#{id}")
    void deleteUserById(Integer id);
    
  • 軟刪除:添加is_deleted字段標記刪除狀態。

    ALTER TABLE user ADD COLUMN is_deleted TINYINT DEFAULT 0;
    
  @Update("UPDATE user SET is_deleted=1 WHERE id=#{id}")void softDeleteUserById(Integer id);

六、功能擴展與優化

1. 事務管理

  • @Transactional注解:確保多個操作在同一事務中執行。
    @Service
    @Transactional
    public class UserService {// CRUD方法
    }
    

2. 分頁與排序

  • PageHelper分頁插件:實現分頁查詢。

    <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.0</version>
    </dependency>
    
  • 排序參數動態傳入:根據請求參數進行排序。

    PageHelper.startPage(pageNum, pageSize).setOrderBy(orderBy);
    

3. 異常處理

  • 全局異常捕獲:使用@ControllerAdvice處理全局異常。
    @ControllerAdvice
    public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());}
    }
    

七、測試與部署

1. 單元測試與集成測試

  • 單元測試:編寫Mapper接口測試用例。

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testpublic void testFindById() {User user = userMapper.findById(1);assertNotNull(user);}
    }
    
  • 集成測試:驗證CRUD功能完整性。

    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    public class UserControllerIT {@Autowiredprivate TestRestTemplate restTemplate;@Testpublic void testGetUser() {ResponseEntity<User> response = restTemplate.getForEntity("/users/1", User.class);assertEquals(HttpStatus.OK, response.getStatusCode());}
    }
    

2. 項目打包與部署

  • 打包為可執行JAR文件

    mvn clean package
    
  • 部署到本地Tomcat或云服務器

    • 將生成的JAR文件上傳至服務器,并通過命令啟動:
      java -jar myapp.jar
      

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

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

相關文章

【Academy】OAuth 2.0 身份驗證漏洞 ------ OAuth 2.0 authentication vulnerabilities

OAuth 2.0 身份驗證漏洞 ------ OAuth 2.0 authentication vulnerabilities 1. 什么是 OAuth&#xff1f;2. OAuth 2.0 是如何工作的&#xff1f;3. OAuth 授權類型3.1 OAuth 范圍3.2 授權代碼授權類型3.3 隱式授權類型 4. OAuth 身份驗證4.1 識別 OAuth 身份驗證4.2 偵察OAuth…

C#常用的循環語句

在C#中&#xff0c;循環是一種控制結構&#xff0c;用于重復執行一組語句直到滿足特定條件。C#提供了幾種循環結構&#xff0c;包括for循環、while循環、do-while循環和foreach循環。每種循環都有其特定的用途和場景。下面我將逐一介紹這些循環的用法。 一、C#循環類型 1. fo…

C語言(23)

字符串函數 11.strstr函數 1.1函數介紹&#xff1a; 頭文件&#xff1a;string.h char *strstr ( const char * str1,const char *str2); 作用&#xff1a;在一個字符串&#xff08;str1&#xff09;中尋找另外一個字符串&#xff08;str2&#xff09;是否出現過 如果找到…

Vue3實戰學習(Vue3的基礎語法學習與使用(超詳細))(3)

目錄 &#xff08;1&#xff09;Vue3工程環境準備、項目基礎腳手架搭建詳細教程。(博客鏈接) &#xff08;2&#xff09;Vue3的基礎語法學習與使用。 &#xff08;1&#xff09;"{{}}"綁定數據。 <1>ref()函數定義變量——綁定數據。 <2>reactive({...})…

vtkDepthSortPolyData 根據相機視圖方向對多邊形數據進行排序

1. 作用 在 3D 渲染中&#xff0c;透明對象的渲染順序非常重要。如果透明對象的渲染順序不正確&#xff0c;可能會導致錯誤的視覺效果&#xff08;例如&#xff0c;遠處的透明對象遮擋了近處的透明對象&#xff09;。vtkDepthSortPolyData 通過對多邊形數據進行深度排序&#…

【2025力扣打卡系列】0-1背包 完全背包

堅持按題型打卡&刷&梳理力扣算法題系列&#xff0c;語言為python3&#xff0c;Day5 0-1背包【目標和】 有n個物品&#xff0c;第i個物品的體積為w[i], 價值為v[i]。每個物品至多選一個&#xff0c;求體積和不超過capacity時的最大價值和常見變形 至多裝capacity&#x…

MyBatis-Plus 分頁查詢接口返回值問題剖析

在使用 MyBatis-Plus 進行分頁查詢時,很多開發者會遇到一個常見的問題:當分頁查詢接口返回值定義為 Page<T> 時,執行查詢會拋出異常;而將返回值修改為 IPage<T> 時,分頁查詢卻能正常工作。本文將從 MyBatis-Plus 的分頁機制入手,詳細分析這一問題的根源,并提…

《人月神話》:軟件工程的成本寓言與生存法則

1975年&#xff0c;Fred Brooks在《人月神話》中寫下那句振聾發聵的斷言——“向進度落后的項目增加人力&#xff0c;只會讓進度更加落后”——時&#xff0c;他或許未曾料到&#xff0c;這一觀點會在半個世紀后的人工智能與云原生時代&#xff0c;依然如達摩克利斯之劍般懸在每…

三維建模與視頻融合(3D-Video Integration)技術初探。

三維建模與視頻融合&#xff08;3D-Video Integration&#xff09;是一種將虛擬三維模型無縫嵌入實拍視頻場景的技術&#xff0c;廣泛應用于影視特效、增強現實&#xff08;AR&#xff09;、游戲開發、廣告制作 、視頻監控 等領域。 一、技術核心流程 三維建模與動畫 使用工具…

SpringMVC-全局異常處理

文章目錄 1. 全局異常處理2. 項目異常處理方案2.1 異常分類2.2 異常解決方案2.3 異常解決方案具體實現 1. 全局異常處理 問題&#xff1a;當我們在SpingMVC代碼中沒有對異常進行處理時&#xff0c;三層架構的默認處理異常方案是將異常拋給上級調用者。也就是說Mapper層報錯會將…

2025 cv2.imwrite存儲帶有中文路徑

一、前言 cv使用的更多一些&#xff0c;不過cv讀取和寫入帶有中文路徑的圖片會報錯有寫出亂碼。 以下代碼是從視頻中獲取第2幀保存在中文文件夾下的實例&#xff1a; cap cv2.VideoCapture("***.mp4")cap.set(cv2.CAP_PROP_POS_FRAMES, 2)ret, framecap.read()cv2…

在 CentOS 上,常用幾種方法來確保 Python 腳本在斷開終端后繼續運行

在 CentOS 上&#xff0c;你可以使用以下幾種方法來確保 Python 腳本在斷開終端后繼續運行&#xff1a; 1. 使用 nohup 命令 nohup 命令可以讓進程在終端關閉后繼續運行。 nohup python main.py > output.log 2>&1 &nohup&#xff1a;忽略掛斷信號&#xff0c…

blazemeter工具使用--用于自動生成jmeter腳本并進行性能測試

1、安裝blazemeter&#xff08;網上有很多詳情的教程&#xff09; 2、開始錄制&#xff1a;設置號你的文件名稱后開始錄制 3、錄制完成后保存為jmeter(jmx)文件 4、在jmeter中打開文件 5、添加一個后置處理器&#xff1a;查看結果樹&#xff0c;后運行看看能否成功&#xf…

6-langchang多模態輸入和自定義輸出

6-langchang多模態輸入和自定義輸出 多模態數據輸入urlbase64url list工具調用自定義輸出: JSON, XML, YAML如何解析 JSON 輸出json如何解析xmlYAML解析器多模態數據輸入 這里我們演示如何將多模態輸入直接傳遞給模型。我們目前期望所有輸入都以與OpenAI 期望的格式相同的格式…

【C#實現手寫Ollama服務交互,實現本地模型對話】

前言 C#手寫Ollama服務交互&#xff0c;實現本地模型對話 最近使用C#調用OllamaSharpe庫實現Ollama本地對話&#xff0c;然后思考著能否自己實現這個功能。經過一番查找&#xff0c;和查看OllamaSharpe源碼發現確實可以。其實就是開啟Ollama服務后&#xff0c;發送HTTP請求&a…

【C#學習筆記02】基本元素與數據類型

引言 深入了解C語言的基本元素、計算機存儲器結構、常量與變量的概念以及數據類型。這些內容是C語言編程的基礎&#xff0c;掌握它們對于編寫高效、可靠的嵌入式程序至關重要。 1.C語言的基本元素 ?編程語言的發展離不開自然語言&#xff0c;所以編程語言的語法和詞匯也是由…

ESP8266TCP客戶端(單連接TCP Client)

單連接TCP Client 電腦作為服務器&#xff0c;8266作為客戶端 1.配置WiFi模式 ATCWMODE3 //softAPstation mode 相應&#xff1a;ok 2.連接路由器 ATCWJAP“SSID”&#xff0c;“password” //SSID就是wifi的名字&#xff0c; password WIFI密碼 響應&#xff…

洛谷 P2234:[HNOI2002] 營業額統計 ← STL set

【題目來源】 https://www.luogu.com.cn/problem/P2234 【題目描述】 Tiger 最近被公司升任為營業部經理&#xff0c;他上任后接受公司交給的第一項任務便是統計并分析公司成立以來的營業情況。 Tiger 拿出了公司的賬本&#xff0c;賬本上記錄了公司成立以來每天的營業額。分析…

VSCode 2025最新前端開發必備插件推薦匯總(提效指南)

&#x1f31f;前言: 如果你是一名前端開發工程師&#xff0c;合適的開發工具能大大提高工作效率。Visual Studio Code (VSCode) 憑借其輕量級、高擴展性的特點&#xff0c;已成為眾多前端開發者在win系電腦的首選IDE。 名人說&#xff1a;博觀而約取&#xff0c;厚積而薄發。—…

Java學習--Redis

官網&#xff1a;https://redis.io 中文網&#xff1a;Redis中文網 Redis安裝包分為 Windows 版和 Linux 版&#xff1a; Windows版下載地址&#xff1a;Releases microsoftarchive/redis GitHub Linux版下載地址&#xff1a; Index of /releases/ 一、Redis簡介 Redis是…