Spring Boot整合MyBatis+MySQL實戰指南(Java 1.8 + 單元測試)

一、環境準備

  • 開發工具:IntelliJ IDEA 2023.1 + JDK 1.8.0_382+ Maven3.6.3
  • 數據庫:MySQL 8.0.21
  • 依賴版本
    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version>
    </parent><dependencies><!-- Web支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis支持 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version></dependency><!-- MySQL驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><!-- 測試支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
    </dependencies>
    

二、項目結構

src/main/java
└─com.shuanglibi.demo├─controller├─service├─mapper├─entity└─DemoApplication.java
src/main/resources├─application.yml└─mapper└─UserMapper.xml
src/test/java└─com.shuanglibi.demo└─service└─UserServiceTest.java

三、核心代碼實現

1. 配置文件 application.yml

spring:datasource:url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8username: rootpassword: xxxxxxdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.shuanglibi.demo.entityconfiguration:map-underscore-to-camel-case: true

2. 實體類 User.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Long id;private String name;private Integer age;private LocalDateTime createTime;
}

3. Mapper接口 UserMapper.java

@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User findById(Long id);@Insert("INSERT INTO user(name, age, create_time) VALUES(#{name}, #{age}, NOW())")@Options(useGeneratedKeys = true, keyProperty = "id")int insert(User user);@Update("UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}")int update(User user);@Delete("DELETE FROM user WHERE id=#{id}")int delete(Long id);
}

4. Service層 UserService.java

@Service
@RequiredArgsConstructor
public class UserService {private final UserMapper userMapper;public User getUserById(Long id) {return userMapper.findById(id);}public int createUser(User user) {return userMapper.insert(user);}public int updateUser(User user) {return userMapper.update(user);}public int deleteUser(Long id) {return userMapper.delete(id);}
}

四、單元測試實現(JUnit 5)

1. 測試基類配置

@SpringBootTest
@Transactional
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class BaseTest {@Autowiredprotected UserService userService;@Autowiredprotected UserMapper userMapper;
}

2. 完整測試類 UserServiceTest.java

class UserServiceTest extends BaseTest {@Testvoid testCRUD() {// 創建測試User newUser = new User(null, "張三", 25, null);int insertResult = userService.createUser(newUser);assertEquals(1, insertResult);assertNotNull(newUser.getId());// 查詢測試User fetchedUser = userService.getUserById(newUser.getId());assertEquals("張三", fetchedUser.getName());assertEquals(25, fetchedUser.getAge());// 更新測試fetchedUser.setAge(26);int updateResult = userService.updateUser(fetchedUser);assertEquals(1, updateResult);User updatedUser = userService.getUserById(fetchedUser.getId());assertEquals(26, updatedUser.getAge());// 刪除測試int deleteResult = userService.deleteUser(newUser.getId());assertEquals(1, deleteResult);User deletedUser = userService.getUserById(newUser.getId());assertNull(deletedUser);}
}

五、關鍵問題解決方案

1. 數據庫連接問題

# 如果出現時區錯誤,在連接URL中添加:
spring.datasource.url: jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai

2. MyBatis注解與XML配置選擇

  • 簡單SQL使用注解方式
  • 復雜SQL推薦XML配置(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.shuanglibi.demo.mapper.UserMapper"><select id="findByName" resultType="User">SELECT * FROM user WHERE name = #{name}</select>
</mapper>

3. 事務管理配置

@Configuration
@EnableTransactionManagement
public class MyBatisConfig {// 可自定義事務管理器
}

六、運行與驗證

  1. 啟動測試類執行所有測試方法
  2. 查看控制臺輸出:
2023-10-20 14:30:22.123  INFO 12345 --- [           main] c.e.d.s.UserServiceTest                  : Started UserServiceTest in 2.345 seconds
2023-10-20 14:30:22.456  INFO 12345 --- [           main] o.s.t.c.transaction.TransactionContext   : Began transaction...

七、擴展建議

  1. 添加分頁查詢:使用PageHelper插件
  2. 集成Swagger文檔:
<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency>
  1. 使用MyBatis Generator自動生成代碼:
<plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.2</version>
</plugin>

文章亮點

  1. 完整覆蓋Spring Boot 2.x + MyBatis整合流程
  2. 提供可直接運行的測試代碼
  3. 包含常見問題解決方案
  4. 遵循Java 1.8語法規范
  5. 使用現代測試框架(JUnit 5 + Spring Boot Test)

建議讀者在實際操作時注意:
6. 提前創建好testdb數據庫
7. 保持MySQL服務正常運行
8. 根據實際情況修改數據庫連接參數
9. 使用Postman進行接口驗證(配合Controller層)

源碼在此,插去直接可以用,記得耐心點等待依賴下載完再啟動。 (Spring Boot整合MyBatis+MySQL源碼)

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

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

相關文章

游戲開發日記

如何用數據表來儲存&#xff0c;位置坐標&#xff08;XYZ&#xff09;&#xff1a;決定了對象在世界中的擺放資源ID / 圖片URL&#xff1a;決定了使用什么模型或貼圖事件ID / 特效&#xff1a;是否觸發某些事件&#xff08;例如點擊、交互&#xff09;邏輯索引&#xff08;Grid…

如何使用xmind編寫測試用例

如何使用xmind編寫測試用例為什么要使用xmind&#xff1f;使用xmind編寫測試用例是為了梳理我們的思路。使用xmind編寫測試用例的思路是什么&#xff1f;先進行分析再提取測試用例。 例如下面的注冊功能的測試用例的分析&#xff1a; 分析&#xff1a; 先提取出需要測試的功能點…

使用LLaMA-Factory微調Qwen2.5-VL-3B 的目標檢測任務-數據集格式轉換(voc 轉 ShareGPT)

一、LLaMA-Factory Qwen2.5-VL ShareGPT 格式要求ShareGPT 格式就是多輪對話的 list&#xff0c;每條數據如下&#xff1a;[{"conversations": [{"from": "user", "value": "<image>\n請標注圖片中的所有目標及其類別和位…

【SkyWalking】服務端部署與微服務無侵入接入實戰指南

【SkyWalking】服務端部署與微服務無侵入接入實戰指南 &#x1f4a1; SkyWalking 系列總引導 在微服務架構快速演進的今天&#xff0c;如何有效實現服務鏈路追蹤、性能分析、日志采集與自動化告警&#xff0c;成為系統穩定性的關鍵保障手段。 SkyWalking&#xff0c;作為 Apa…

LVDS系列20:Xilinx 7系ISERDESE2原語(一)

Xilinx 7系FPGA bank的io單元如下&#xff1a;Hr bank比hp bank少odelaye2組件&#xff0c;兩者的idelaye2組件后面&#xff0c;都有iserdese2組件&#xff1b; iserdese2組件是一種專用的串并轉換器或稱解串器&#xff0c;用于高速源同步應用&#xff0c;如大部分LVDS信號解析…

【U-Boot】Shell指令

目錄 U-Boot 三個Shell U-Boot Shell Linux Shell shell腳本 總結 U-Boot Shell命令 幫助命令 部分命令分類與功能說明 一、基礎操作與信息查詢 二、內存操作 三、啟動管理 四、文件系統操作 五、設備與分區管理 六、環境變量 七、診斷與調試 八、特殊功能 九…

《Revisiting Generative Replay for Class Incremental Object Detection》閱讀筆記

摘要Abstract部分 原文 Generative replay has gained significant attention in class-incremental learning; however, its application to Class Incremental Object Detection (CIOD) remains limited due to the challenges in generating complex images with precise …

Mysql: Bin log原理以及三種格式

目錄 一、什么是 Binlog&#xff1f; 二、Binlog 的應用場景與案例 1. 數據恢復 (Point-in-Time Recovery) 2. 主從復制 (Master-Slave Replication) 3. 數據審計 三、Binlog 的三種格式 1. STATEMENT 模式 (Statement-Based Logging - SBL) 2. ROW 模式 (Row-Based Log…

LiteHub之文件下載與視頻播放

文件下載 前端請求 箭頭函數 //這個箭頭函數可以形象理解為&#xff0c;x流入&#xff08;>&#xff09;x*x, //自然而然>前面的就是傳入參數,>表示函數體 x > x * x//相當于 function (x) {return x * x; }//如果參數不是一個&#xff0c;就需要用括號()括起來…

QT5使用cmakelists引入Qt5Xlsx庫并使用

1、首先需要已經有了Qt5Xlsx的頭文件和庫&#xff0c;并拷貝到程序exe路徑下&#xff08;以xxx.exe/3rdparty/qtxlsx路徑為例&#xff0c;Qt5Xlsx版本為0.3.0&#xff09;&#xff1b; 2、cmakelist中&#xff1a; # 設置 QtXlsx 路徑 set(QTXLSX_ROOT_DIR ${CMAKE_CURRENT_SOU…

醋酸鐠:閃亮的稀土寶藏,掀開科技應用新篇章

一、什么是醋酸鐠醋酸鐠是一種鐠的有機鹽&#xff0c;鐠是稀土金屬元素之一。作為一種重要的稀土化合物&#xff0c;醋酸鐠通常以水合物的形式存在&#xff0c;呈現淡黃色或無色結晶。鐠元素本身因其獨特的物理化學特性&#xff0c;在工業和科技領域有著廣泛應用&#xff0c;而…

深入解析JVM內存結構與垃圾回收機制

java是強類型高級語言JVM&#xff08;Java Virtual Machine&#xff0c;Java虛擬機&#xff09;是Java平臺的核心組件&#xff0c;它是一個虛擬的計算機&#xff0c;能夠執行Java字節碼&#xff08;bytecode&#xff09;。1、區域劃分JVM對Java內存的管理也是分區分塊進行&…

Java 流程控制詳解:從順序執行到跳轉語句,掌握程序邏輯設計

作為一名Java開發工程師&#xff0c;你一定知道&#xff0c;流程控制&#xff08;Flow Control&#xff09; 是編寫任何程序的核心。它決定了代碼的執行路徑、分支走向和循環次數。本文將帶你系統梳理 Java中的所有常用流程控制結構&#xff0c;包括&#xff1a;順序結構分支結…

面試150 環形鏈表

思路 采用雙指針法,slow指針每次走一步,fast指針每次走兩步&#xff0c;如果相遇的情況下&#xff0c;slow指針回到開始的位置,此時快慢指針各走一步&#xff0c;當相遇的時候也就是說明鏈表中有環。 # Definition for singly-linked list. # class ListNode: # def __init…

AI技術正在深度重構全球產業格局,其影響已超越工具屬性,演變為推動行業變革的核心引擎。

一、AI如何重塑AI的工作與行業&#xff08;AI助手領域&#xff09;能力升級理解與生成&#xff1a;基于LLM&#xff08;大語言模型&#xff09;&#xff0c;AI能處理開放式問題、撰寫報告、翻譯代碼&#xff0c;替代部分人類知識工作。個性化交互&#xff1a;通過用戶歷史對話分…

Kafka的無消息丟失配置怎么實現

那 Kafka 到底在什么情況下才能保證消息不丟失呢&#xff1f; Kafka 只對“已提交”的消息&#xff08;committed message&#xff09;做有限度的持久化保證。 第一個核心要素是“已提交的消息”。什么是已提交的消息&#xff1f;當 Kafka 的若干個 Broker 成 功地接收到一條…

集成CommitLInt+ESLint+Prettier+StyleLint+LintStaged

代碼可讀性低代碼 代碼規范落地難代碼格式難統一代碼質量低下 配置 ESLint ESLint 是一個用來識別 ECMAScript 并且按照規則給出報告的代碼檢測工具&#xff0c;使用它可以避免低級錯誤和統一代碼的風格。它擁有以下功能&#xff1a; 查出 JavaScript 代碼語法問題。根據配置…

尋找兩個正序數組的中位數(C++)

給定兩個大小分別為 m 和 n 的正序&#xff08;從小到大&#xff09;數組 nums1 和 nums2。請你找出并返回這兩個正序數組的 中位數 。算法的時間復雜度應該為 O(log (mn)) 。示例 1&#xff1a;輸入&#xff1a;nums1 [1,3], nums2 [2] 輸出&#xff1a;2.00000 解釋&#x…

Expected Sarsa 算法的數學原理

&#x1f31f; 一、Expected Sarsa 算法的數學原理 1. 什么是 Expected Sarsa&#xff1f; Expected Sarsa 是一種基于 時序差分&#xff08;Temporal Difference, TD&#xff09;學習 的強化學習算法&#xff0c;用于估計 動作值函數 ( q_{\pi}(s, a) )。它是 Sarsa 算法的一種…

Vue的watch和React的useEffect

參考文章&#xff1a;https://zhuanlan.zhihu.com/p/686329898