当前位置: 首页 > news >正文

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 { }
http://www.jsqmd.com/news/647638/

相关文章:

  • 告别手敲!用CodeMirror 6给你的Web编辑器加上智能提示(附自定义补全源实战)
  • Redis怎样通过频道划分不同的日志级别
  • 情绪智商(EQ)在代码世界的重要性:软件测试从业者的专业视角
  • AI 术语入门指南
  • 【医药AI实战系列④】医药NLP的天花板在哪里,从PubMed挖矿到监管文件解析,BioBERT到GPT-4o的能力边界
  • 面向AI电梯呼梯盒高效可靠电源与接口控制的MOSFET选型策略与器件适配手册
  • 2026 慢 SQL 优化手册:EXPLAIN 深度解读 + 9 类索引失效场景(生产避坑)
  • SYNBO 亮相上海以太坊高校行,与 ETHPanda、LXDAO 共建Web3青年交流场域
  • 黄金100小时!全球500支战队巅峰对决,黑马逆袭正当时,53 万美金终落谁家?
  • 带你读懂FDE,深入拆解FDE的应用
  • 技术重构中的架构调整与代码改进
  • 联邦学习后门防御的隐形杀手:模型权重符号翻转攻击的隐蔽性与突破性分析
  • 2025届毕业生推荐的AI辅助论文工具推荐榜单
  • MySQL 8.0/8.4/9.0 核心区别:面试官必问(版本选型 + 升级理由)
  • 从一次性活动到长期增长:品牌推广如何让推荐裂变计划真正跑起来?
  • Prompt工程师正在被淘汰?不——掌握这6类动态模态路由Prompt设计法的人,薪资已突破¥125K/月
  • Linux基础开发工具(编写一个简易进度条)
  • 哈佛教授获诺奖的研究:你看到的不是全部,用心看才是真的看
  • Redis怎样实现短链接映射_通过String类型存储Key-Value对
  • 2026年抗老面霜终极排雷榜:拆开配方表,谁在真抗老,谁在收智商税
  • 发布计划管理化技术版本规划与依赖管理
  • C语言条件编译精讲
  • AI大模型-6:MCP原理和开发
  • Web前端技术第四次作业:表单实验报告
  • CANopen | 网络管理NMT实战 - 从命令解析到自主状态控制
  • 突破传统化学研究的终极AI助手:深度解析ChemBERTa如何实现分子智能预测的革命
  • awk以及ansible
  • 多模态大模型云端协同部署的“隐性成本黑洞”:带宽错配、冷启动惩罚、跨AZ语义一致性丢失(独家压测报告)
  • Sunshine终极配置指南:如何搭建专业级游戏串流服务器
  • 前后端连通性测试以及前端页面总体设计