news 2026/5/4 11:09:17

Spring整合Mybatis详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring整合Mybatis详解

spring整合Mybatis

  • 目的:替换spring提供的Mybatis配置文件

    核心流程

    Spring 容器通过 SqlSessionFactoryBean 构建 MyBatis 核心工厂,再通过 MapperScannerConfigurer/@MapperScan 扫描并注册 Mapper 动态代理 Bean,最终实现 Service 层注入 Mapper 并执行数据库操作,全程由 Spring 托管生命周期与事务。

    配置依赖

    核心配置类,DataSource的配置

public class MybatisConfig { /**定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象 *构建Mybatis核心工厂 * DataSource:数据源,Spring创建好多管理数据库连接的Bean对象 **/ @Bean public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){ //创建SqlSessionFactoryBean对象 SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); //扫描包下的所有实体类,同时配置别名,在xml文件中resultType="user",不用全类名了 ssfb.setTypeAliasesPackage("com.itheima.domain"); //给Mybatis设置数据库连接信息 ssfb.setDataSource(dataSource); return ssfb; } /** * 通过 MapperScannerConfigurer/@MapperScan 扫描并注册 Mapper 动态代理 Bean */ @Bean public MapperScannerConfigurer mapperScannerConfigurer(){ //创建扫描器对象 MapperScannerConfigurer msc = new MapperScannerConfigurer(); //设置扫描的包名,这样的话包下的所有接口都会被扫描到,自动当成Mapper接口,不用@Mapper //如果不做这个配置,可以在启动类中使用@MapperScan注解,指定扫描的包名 msc.setBasePackage("com.itheima.dao"); return msc; } }

Spring 注入 MyBatis 核心流程(4 大阶段)

阶段 1:Spring 容器启动,初始化核心组件和代码有什么关系

Spring 启动 → 自动找配置类MybatisConfig
执行第一个Bean
Spring 在这里做了 3 件事:

  1. 创建 SqlSessionFactoryBean
  2. 注入 dataSource(连接池)
  3. 生成 MyBatis 的核心:SqlSessionFactory
阶段 2:扫描 Mapper 接口,注册动态代理 Bean

通过@MapperScan("com.itheima.dao")MapperScannerConfigurer实现:

  1. 扫描触发:Spring 启动时,@MapperScan会触发MapperScannerRegistrar,扫描指定包下所有标注@Mapper的接口。
  2. 动态代理注册
阶段 3:Service 层注入 Mapper,建立依赖关系

Service 层通过 @Autowired/@Resource 注入 Mapper 接口:

阶段 4:执行数据库操作(核心交互逻辑

调用 Mapper 方法时,底层由SqlSessionTemplate完成线程安全的数据库操作:

  1. 代理拦截:Mapper 代理对象(MapperProxy)拦截方法调用,将请求封装为MapperMethod

  2. 获取 SqlSessionMapperProxy依赖SqlSessionTemplate(线程安全的SqlSession封装类),通过ThreadLocal绑定当前线程的SqlSession

    • 若当前线程存在 Spring 事务,复用已绑定的SqlSession(保证事务一致性)。
    • 若无事务,临时创建新的SqlSession,操作完成后自动关闭。
  3. 执行 SQL 并返回SqlSessionTemplate调用 MyBatis 底层Executor执行 SQL,处理结果映射,最终返回数据。

  4. 事务管理:若方法标注@Transactional,Spring 事务管理器会自动控制事务提交 / 回滚;无事务时,SqlSessionTemplate自动提交并关闭连接,避免资源泄漏。

整合 MyBatis 到 Spring 的核心价值:

  1. 资源管理自动化- 避免资源泄漏
  2. 声明式事务- 简化事务控制
  3. 资源管理自动化- 避免资源泄漏
  4. 声明式事务- 简化事务控制
  5. 依赖注入- 解耦组件关系---可以通过Autowired注入mapper,不再需要手动创建
  6. 统一配置- 集中管理配置
  7. 异常统一处理- 简化错误处理---spring自动将Mybatis异常转换为DataAccessException
  8. 生态集成- 无缝使用 Spring 全家桶--直接通过注解进行缓存,事务,定时任务等
  9. 测试友好- 便于单元测试和集成测试
  • 使用sqlSessionFactoryBean转化
  • @ Configuration //添加Bean扫描路径 @ ComponentScan("com.itheima") //@ PropertySource:加载类路径jdbc.properties文件 //可以使用@Value("${属性名}")使用其中的属性值 //@ Value可以在配置文件中找key @ PropertySource("classpath:jdbc.properties") @ Import({JdbcConfig.class,MybatisConfig.class})//导入JdbcConfig和MybatisConfig配置类 //也可以在相应配置类加@Configuration注解 public class SpringConfig { }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 1:17:38

请停止过度设计:浏览器已经解决了这 8 个问题

这篇文章里,我整理了 8 个很强、却依然被大量低估的浏览器能力。它们不算花哨,但真的很实用。有些功能,甚至会直接改变你对“前端到底该怎么做”的理解。所以,别急着装依赖。先往下看。也许你会发现,自己这些年其实绕了…

作者头像 李华
网站建设 2026/4/16 1:14:04

从阻容复位到专用芯片:以MAX706为例,解析MCU看门狗复位电路的设计升级

1. 为什么MCU需要可靠的复位电路 我第一次用阻容复位电路是在大学电子设计竞赛上。当时用了一个10k电阻加0.1uF电容的经典组合给STM32做复位,结果在作品演示时,评委按下复位键后系统直接死机了。后来才知道,这种简单的阻容复位在电源波动时特…

作者头像 李华
网站建设 2026/4/16 1:13:11

多模态大模型出海最后一公里卡点破解:零样本跨语言图文生成成功率从33%→89%的4项工程级优化(含GitHub可运行代码仓)

第一章:多模态大模型跨语言迁移能力的定义与核心挑战 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型跨语言迁移能力,是指模型在不依赖目标语言大规模标注数据的前提下,将视觉-语言联合表征能力从高资源语言(如英语&…

作者头像 李华
网站建设 2026/4/16 1:11:12

DocuSeal:开源电子签名平台 - DocuSign免费替代方案

DocuSeal:开源电子签名平台 - DocuSign免费替代方案 背景 在数字化转型浪潮中,电子签名已成为企业处理合同、协议和正式文档的标配工具。DocuSign、Adobe Sign等商业解决方案虽然功能完善,但高昂的订阅费用让许多中小企业望而却步。DocuSeal作…

作者头像 李华
网站建设 2026/4/17 7:01:08

科普:python的pandas包中的DataFrame就是二维表

一、DataFrame 本质 带表头 行号的二维表 pandas 的 DataFrame 就是一个二维表** 它自带的所有属性,都是为了描述这个二维表的: 行、列、值、形状、类型……**df.columns(列名 / 表头)↓ ↓card_id amount ← 列名┌──…

作者头像 李华