Spring整合MyBatis詳解

Spring整合MyBatis詳解

    • 一、整合優勢與核心思路
      • 1.1 整合優勢
      • 1.2 核心整合思路
    • 二、環境搭建與依賴配置
      • 2.1 開發環境
      • 2.2 Maven依賴配置
    • 三、整合配置(核心步驟)
      • 3.1 數據庫配置文件(db.properties)
      • 3.2 Spring配置文件(spring-mybatis.xml)
    • 四、實戰案例:用戶管理模塊
      • 4.1 數據庫表設計
      • 4.2 POJO實體類(User.java)
      • 4.3 Mapper接口與XML
        • 4.3.1 UserMapper接口
        • 4.3.2 UserMapper.xml(映射文件)
      • 4.4 Service層(業務邏輯)
      • 4.5 測試類
    • 五、常見問題與避坑指南
      • 5.1 Mapper注入失敗(NoSuchBeanDefinitionException)
      • 5.2 事務不生效(@Transactional無效)
      • 5.3 Mapper XML與接口不匹配

企業級開發中,Spring(負責依賴管理和事務控制)與MyBatis(負責持久層操作)的整合是主流方案,本文我將詳細講解Spring整合MyBatis的完整流程,這種整合能充分發揮兩者優勢:Spring的IoC容器管理MyBatis的核心組件,AOP實現事務控制;MyBatis簡化數據庫操作。

一、整合優勢與核心思路

1.1 整合優勢

  • 依賴管理自動化:Spring的IoC容器自動管理MyBatis的SqlSessionFactoryMapper等組件,無需手動創建;
  • 事務控制簡化:通過Spring的@Transactional注解輕松實現事務管理,替代MyBatis手動提交事務的繁瑣操作;
  • 配置集中化:數據庫連接信息、MyBatis配置等統一在Spring配置中管理,便于維護;
  • 開發效率提升:開發者專注業務邏輯,無需關注組件創建和資源釋放。

1.2 核心整合思路

Spring整合MyBatis的核心是將MyBatis的核心組件交給Spring管理,關鍵步驟:

  1. Spring管理數據源(DataSource);
  2. Spring創建SqlSessionFactory(依賴數據源和MyBatis配置);
  3. Spring自動掃描Mapper接口,生成代理對象并注入到Service中;
  4. Spring管理事務(通過DataSourceTransactionManager)。

二、環境搭建與依賴配置

2.1 開發環境

  • JDK:1.8+
  • 依賴管理:Maven
  • 框架版本:Spring 5.3.x + MyBatis 3.5.x
  • 數據庫:MySQL 8.0

2.2 Maven依賴配置

pom.xml中添加核心依賴(Spring核心、Spring-JDBC、MyBatis、MyBatis-Spring整合包、MySQL驅動):

<dependencies><!-- Spring核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version></dependency><!-- Spring JDBC(數據源和事務) --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.20</version></dependency><!-- MyBatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><!-- MyBatis與Spring整合包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.7</version></dependency><!-- MySQL驅動 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version></dependency><!-- 數據庫連接池(HikariCP,Spring默認) --><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>4.0.3</version></dependency><!--  lombok(簡化POJO代碼) --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><optional>true</optional></dependency>
</dependencies>

三、整合配置(核心步驟)

整合配置采用注解+XML混合方式(XML配置數據源和MyBatis,注解管理Bean),清晰分離配置與業務代碼。

3.1 數據庫配置文件(db.properties)

創建src/main/resources/db.properties,存儲數據庫連接信息:

# db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
jdbc.maxPoolSize=10
jdbc.minIdle=5

3.2 Spring配置文件(spring-mybatis.xml)

創建src/main/resources/spring-mybatis.xml,配置數據源、SqlSessionFactory、Mapper掃描等核心組件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttps://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 1. 掃描注解(Service、Repository等) --><context:component-scan base-package="com.example"/><!-- 2. 加載數據庫配置文件 --><context:property-placeholder location="classpath:db.properties"/><!-- 3. 配置數據源(HikariCP連接池) --><bean id="dataSource" class="com.zaxxer.hikari.HikariConfig"><property name="driverClassName" value="${jdbc.driver}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><property name="maximumPoolSize" value="${jdbc.maxPoolSize}"/><property name="minimumIdle" value="${jdbc.minIdle}"/></bean><bean id="hikariDataSource" class="com.zaxxer.hikari.HikariDataSource"><constructor-arg ref="dataSource"/></bean><!-- 4. 配置SqlSessionFactory(MyBatis核心) --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="hikariDataSource"/> <!-- 關聯數據源 --><property name="mapperLocations" value="classpath:mapper/*.xml"/> <!-- Mapper XML路徑 --><property name="typeAliasesPackage" value="com.example.pojo"/> <!-- 別名包 --><!-- 配置MyBatis全局設置(可選) --><property name="configuration"><bean class="org.apache.ibatis.session.Configuration"><property name="mapUnderscoreToCamelCase" value="true"/> <!-- 下劃線轉駝峰 --><property name="logImpl" value="org.apache.ibatis.logging.stdout.StdOutImpl"/> <!-- 日志 --></bean></property></bean><!-- 5. 掃描Mapper接口(生成代理對象,注入Spring容器) --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example.mapper"/> <!-- Mapper接口包路徑 --><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/></bean><!-- 6. 配置事務管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="hikariDataSource"/></bean><!-- 7. 開啟事務注解支持 --><tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

四、實戰案例:用戶管理模塊

通過一個完整的用戶管理模塊(CRUD操作)演示整合后的使用流程。

4.1 數據庫表設計

創建user表:

CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT,`username` varchar(50) NOT NULL,`age` int DEFAULT NULL,`create_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

4.2 POJO實體類(User.java)

package com.example.pojo;import lombok.Data;
import java.util.Date;@Data // lombok注解,自動生成getter/setter
public class User {private Integer id;private String username;private Integer age;private Date createTime;
}

4.3 Mapper接口與XML

4.3.1 UserMapper接口
package com.example.mapper;import com.example.pojo.User;
import java.util.List;public interface UserMapper {// 新增int insert(User user);// 更新int update(User user);// 刪除int deleteById(Integer id);// 根據ID查詢User selectById(Integer id);// 查詢所有List<User> selectAll();
}
4.3.2 UserMapper.xml(映射文件)

創建src/main/resources/mapper/UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.UserMapper"><!-- 新增 --><insert id="insert" useGeneratedKeys="true" keyProperty="id">INSERT INTO user (username, age, create_time)VALUES (#{username}, #{age}, #{createTime})</insert><!-- 更新 --><update id="update">UPDATE userSET username = #{username}, age = #{age}WHERE id = #{id}</update><!-- 刪除 --><delete id="deleteById">DELETE FROM user WHERE id = #{id}</delete><!-- 根據ID查詢 --><select id="selectById" resultType="User">SELECT id, username, age, create_time AS createTimeFROM userWHERE id = #{id}</select><!-- 查詢所有 --><select id="selectAll" resultType="User">SELECT id, username, age, create_time AS createTimeFROM user</select>
</mapper>

4.4 Service層(業務邏輯)

package com.example.service;import com.example.mapper.UserMapper;
import com.example.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;@Service
public class UserService {// 注入Mapper接口(Spring自動生成代理對象)@Autowiredprivate UserMapper userMapper;// 新增用戶(添加事務)@Transactionalpublic int addUser(User user) {user.setCreateTime(new Date()); // 設置創建時間return userMapper.insert(user);}// 更新用戶@Transactionalpublic int updateUser(User user) {return userMapper.update(user);}// 刪除用戶@Transactionalpublic int deleteUser(Integer id) {return userMapper.deleteById(id);}// 根據ID查詢public User getUserById(Integer id) {return userMapper.selectById(id);}// 查詢所有public List<User> getAllUsers() {return userMapper.selectAll();}
}

4.5 測試類

package com.example.test;import com.example.pojo.User;
import com.example.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;public class UserTest {public static void main(String[] args) {// 加載Spring配置,啟動容器ApplicationContext context = new ClassPathXmlApplicationContext("spring-mybatis.xml");UserService userService = context.getBean(UserService.class);// 1. 新增用戶User user = new User();user.setUsername("Spring-MyBatis");user.setAge(25);userService.addUser(user);System.out.println("新增用戶ID:" + user.getId());// 2. 查詢用戶User queryUser = userService.getUserById(user.getId());System.out.println("查詢用戶:" + queryUser);// 3. 更新用戶queryUser.setAge(26);userService.updateUser(queryUser);System.out.println("更新后年齡:" + userService.getUserById(user.getId()).getAge());// 4. 查詢所有List<User> users = userService.getAllUsers();System.out.println("所有用戶:" + users);// 5. 刪除用戶userService.deleteUser(user.getId());System.out.println("刪除后查詢:" + userService.getUserById(user.getId()));}
}

五、常見問題與避坑指南

5.1 Mapper注入失敗(NoSuchBeanDefinitionException)

錯誤信息No qualifying bean of type 'com.example.mapper.UserMapper' available

原因

  • MapperScannerConfigurerbasePackage配置錯誤(未掃描到Mapper接口);
  • Mapper接口未定義(或包路徑與配置不符);
  • SqlSessionFactory未正確創建(依賴的數據源錯誤)。

解決方案

  • 檢查basePackage是否正確(value="com.example.mapper");
  • 確保Mapper接口在指定包下(com.example.mapper);
  • 查看日志,確認SqlSessionFactory和數據源初始化成功。

5.2 事務不生效(@Transactional無效)

問題:Service方法中拋出異常,但數據庫操作未回滾。

原因

  • 異常被try-catch捕獲(未拋出到外層,Spring無法感知);
  • 拋出的異常不是RuntimeException(默認只回滾運行時異常);
  • @Transactional注解被添加到非public方法上(Spring事務不支持非public方法)。

解決方案

  • 不捕獲異常,或捕獲后重新拋出:
@Transactional
public void addUser(User user) {try {// 業務邏輯} catch (Exception e) {throw new RuntimeException(e); // 拋出運行時異常}
}
  • 若需支持checked異常,指定rollbackFor
@Transactional(rollbackFor = Exception.class) // 所有異常都回滾

5.3 Mapper XML與接口不匹配

錯誤信息org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.mapper.UserMapper.selectById

原因

  • Mapper XML的namespace與接口全類名不一致;
  • XML中id與接口方法名不一致;
  • XML文件未被正確加載(mapperLocations配置錯誤)。

解決方案

  • 確保namespace正確(namespace="com.example.mapper.UserMapper");
  • 保持id與方法名一致(selectById對應selectById);
  • 檢查mapperLocations配置(value="classpath:mapper/*.xml"需與XML存放路徑一致)。

總結:Spring整合MyBatis的核心要點

  1. 簡化配置與管理:Spring的IoC容器統一管理數據源、SqlSessionFactory、Mapper等組件,無需手動創建和釋放資源;
  2. 強大的事務支持:通過@Transactional注解輕松實現事務控制,替代MyBatis手動提交/回滾的繁瑣操作;
  3. 開發效率提升:開發者只需關注業務邏輯(Service)和SQL編寫(Mapper),組件依賴和生命周期由Spring自動處理;
  4. 擴展性強:支持連接池、日志、緩存等高級特性,且易于集成其他Spring生態組件(如Spring MVC、Spring Boot)。

若這篇內容幫到你,動動手指支持下!關注不迷路,干貨持續輸出!
ヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノ

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

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

相關文章

Windows CMD(命令提示符)中最常用的命令匯總和實戰示例

CMD命令匯總 下面是 Windows CMD&#xff08;命令提示符&#xff09;中最常用的命令匯總&#xff0c;共 30 個&#xff0c;包含說明和典型代碼示例&#xff0c;適合日常開發、系統操作、文件管理、網絡診斷等場景。一、文件與目錄操作&#xff08;最常用&#xff09;命令說明示…

嵌入式硬件篇---舵機(示波器)

舵機是一種高精度的角度控制執行器件&#xff0c;廣泛應用于機器人、航模、自動化設備等領域。其核心特點是能通過控制信號精準定位到特定角度&#xff08;通常范圍為 0-180&#xff0c;部分可到 360 連續旋轉&#xff09;。常見的舵機類型可根據結構、控制方式、用途等維度劃分…

嵌入式硬件篇---按鍵

按鍵是電子系統中最基礎的人機交互部件&#xff0c;通過機械或電子方式實現電路通斷或狀態切換。根據結構和工作原理的不同&#xff0c;常見按鍵可分為機械按鍵、薄膜按鍵、觸摸按鍵等&#xff0c;以下詳細介紹其工作原理、應用場景及電路特點&#xff1a;一、機械按鍵&#xf…

試用SAP BTP 06:AI服務-Data Attribute Recommendation

創建實例 方法一&#xff1a;BTP主控室-子賬戶-服務市場 輸入實例配置信息&#xff0c;下一步 不用參數&#xff0c;下一步 審核實例&#xff0c;點擊創建 實例創建完成后&#xff0c;創建服務鍵值 輸入鍵值名稱&#xff0c;點擊 創建 方法二&#xff08;建議&#xff09;&…

訓詁學中的“形音義互求”對NLP、知識圖譜、注意力機制的啟示

一、訓詁學與現代人工智能結合的學術價值與技術潛力1. ??訓詁學的核心優勢與AI語義分析的契合點??訓詁學作為中國傳統學術中研究古代文獻語義的核心學科&#xff0c;其方法論和理論框架對自然語言處理&#xff08;NLP&#xff09;的深層語義分析具有深刻的啟發性和技術補充…

http基礎一

1. HTTP是什么&#xff1f; HTTP&#xff08;超文本傳輸協議&#xff0c;HyperText Transfer Protocol&#xff09;是一種用于從萬維網服務器傳輸超文本到本地瀏覽器的協議。它是無狀態的客戶端-服務器協議&#xff0c;通常在Web瀏覽器和Web服務器之間用于傳輸網頁、圖片、視頻…

西門子 S7-1500 系列 PLC CPU 選型全指南:從類型到實戰

在西門子 S7-1500 系列 PLC 的系統構建中&#xff0c;CPU 作為核心控制單元&#xff0c;其選型直接決定了自動化系統的性能、功能擴展性和適用場景。本文將系統解析 S7-1500 系列 CPU 的類型劃分、核心參數、典型型號功能及選型流程&#xff0c;助你精準匹配工業控制需求。一、…

PaddleOCR 與 PaddleX 調試

PaddleOCR 與 PaddleX 調試1.安裝1.1 環境準備1.2用Conda創建虛擬環境2.測試2.1發票測試2.2 手寫漢字識別3.PaddleOCR 與 PaddleX 對比3.1 基于 PaddleX 部署 OCR 服務1.安裝 PP OCR 文檔 1.1 環境準備 根據自己操作系統按網上指導安裝 ccache ccache --version是否已安裝 …

imx6ull-系統移植篇11——U-Boot 移植(下)

目錄 前言 移植過程 添加開發板默認配置文件 添加開發板對應的頭文件 添加開發板對應的板級文件夾 修改Makefile 文件 修改imximage.cfg 文件 修改Kconfig 文件 修改MAINTAINERS 文件 修改 U-Boot 圖形界面配置文件 編譯 uboot LCD 驅動修改 修改源文件 修改頭文…

30天打牢數模基礎-模擬退火算法講解

二、完整Python代碼 import random import mathdef rastrigin(x, y):"""二維Rastrigin函數&#xff08;目標函數&#xff0c;需最小化&#xff09;參數&#xff1a;x: 自變量xy: 自變量y返回&#xff1a;函數值f(x,y)"""return 20 x**2 y**2 …

論文閱讀 - FastInst

文章目錄1 概述2 模型說明2.1 總體架構2.2 輕量pixel decoder2.3 實例激活引導的Query2.4 雙路徑更新策略2.5 GT掩碼引導學習2.6 損失函數3 效果1 概述 FastInst是一種基于query的實時實例分割方法&#xff0c;它能以32.5FPS的實時速度在COCO測試集上達到40.5的AP。在實例分割…

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點)

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點) 1. 集群架構規劃 生產環境中的 Elasticsearch 集群需要高可用性和容錯能力。以下是基于 3 主節點 + 3 數據節點的架構規劃: 節點分布: 主節點(Master Nodes):3 臺(master-node-1, master-node-2, maste…

Unity_通過鼠標點擊屏幕移動屏幕里的一個對象

文章目錄一、獲取到點擊物體的Tansform&#xff08;摁下鼠標左鍵的瞬間&#xff09;二、移動點擊的物體&#xff08;摁著鼠標左鍵不放&#xff09;三、松開左鍵清理被移動對象屬性總結注&#xff1a;本文章只是學習總結的筆記&#xff0c;視頻鏈接 一、獲取到點擊物體的Tansfor…

UDP中的單播,多播,廣播(代碼實現)

文章目錄1. UDP 單播&#xff08;Unicast&#xff09;示例2. UDP 廣播&#xff08;Broadcast&#xff09;示例3. UDP 多播&#xff08;Multicast&#xff09;示例3.1 多播發送方示例3.2 多播接收方示例總結1. UDP 單播&#xff08;Unicast&#xff09;示例 發送方向指定單個目…

神經網絡:卷積層

神經網絡 卷積操作 例子&#xff1a; 輸入&#xff1a;二維圖像 [1,2,0,3,1] [0,1,2,3,1] [1,2,1,0,0] [5,2,3,1,1] [2,1,0,1,1] 卷積核&#xff1a; [1,2,1] [0,1,0] [2,1,0] 然后需要將輸入圖像和卷積核轉化為4維張量 為什么轉為4維張量&#xff1f;因為卷積操作需要輸入圖像…

2.4 組件間通信Props(父傳子)

父組件 在父組件模板上的子組件上加上屬性值&#xff0c;屬性值就是想要傳遞給子組件的信息。 例如&#xff1a; <template> <div class"Big-box"><testBox :personList"p"></testBox> </div> </template>子組件 子組…

從零開始學習 Redux:React Native 項目中的狀態管理

Redux 是一個用于 JavaScript 應用程序的狀態管理庫&#xff0c;通常與 React 或 React Native 配合使用&#xff0c;幫助管理應用的狀態和數據流。其核心原理是通過集中式的“單一數據源”來管理應用狀態&#xff0c;避免組件之間的“層層傳遞”狀態和副作用。 Redux 的原理單…

[特殊字符] CentOS 7 離線安裝 MySQL 5.7 實驗

&#x1f427; CentOS 7 離線安裝 MySQL 5.7 實驗 針對企業無互聯網環境的系統&#xff0c;設計了如何在 CentOS 7 系統中&#xff0c;使用一臺可以聯網的主機&#xff08;NodeA&#xff09;為另一臺無法聯網的主機&#xff08;NodeB&#xff09;安裝 MySQL 5.7 數據庫及其依賴…

Redis 概率型數據結構實戰指南

1. 為什么要用「近似」&#xff1f; 隨著業務量爆發式增長&#xff0c;精確統計 的內存或 CPU 成本可能難以接受。例如&#xff1a; 統計一天內 唯一 IP 數 —— 用 SET 精確去重&#xff0c;百萬 IP→占用數百 MB。統計海量商品銷量、實時計算 P99 延遲、獲取 TOP-N 熱門頁面……

Android開發工程師:Linux一條find grep命令通關搜索內容與文件

find . -type f \( -name "*.java" -o -name "*.xml" \) -not -path "./out/*" -exec grep -irnE activity|class {} 多關鍵詞搜索&#xff1a;使用正則表達式 pattern1|pattern2 同時搜索多個關鍵詞&#xff08;如 activity|class&#xff09;單…