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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;单…