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 件事:
- 创建 SqlSessionFactoryBean
- 注入 dataSource(连接池)
- 生成 MyBatis 的核心:SqlSessionFactory
阶段 2:扫描 Mapper 接口,注册动态代理 Bean
通过@MapperScan("com.itheima.dao")或MapperScannerConfigurer实现:
- 扫描触发:Spring 启动时,
@MapperScan会触发MapperScannerRegistrar,扫描指定包下所有标注@Mapper的接口。 - 动态代理注册
阶段 3:Service 层注入 Mapper,建立依赖关系
Service 层通过 @Autowired/@Resource 注入 Mapper 接口:
阶段 4:执行数据库操作(核心交互逻辑
调用 Mapper 方法时,底层由SqlSessionTemplate完成线程安全的数据库操作:
代理拦截:Mapper 代理对象(
MapperProxy)拦截方法调用,将请求封装为MapperMethod。获取 SqlSession:
MapperProxy依赖SqlSessionTemplate(线程安全的SqlSession封装类),通过ThreadLocal绑定当前线程的SqlSession:- 若当前线程存在 Spring 事务,复用已绑定的
SqlSession(保证事务一致性)。 - 若无事务,临时创建新的
SqlSession,操作完成后自动关闭。
- 若当前线程存在 Spring 事务,复用已绑定的
执行 SQL 并返回:
SqlSessionTemplate调用 MyBatis 底层Executor执行 SQL,处理结果映射,最终返回数据。事务管理:若方法标注
@Transactional,Spring 事务管理器会自动控制事务提交 / 回滚;无事务时,SqlSessionTemplate自动提交并关闭连接,避免资源泄漏。
整合 MyBatis 到 Spring 的核心价值:
- 资源管理自动化- 避免资源泄漏
- 声明式事务- 简化事务控制
- 资源管理自动化- 避免资源泄漏
- 声明式事务- 简化事务控制
- 依赖注入- 解耦组件关系---可以通过Autowired注入mapper,不再需要手动创建
- 统一配置- 集中管理配置
- 异常统一处理- 简化错误处理---spring自动将Mybatis异常转换为DataAccessException
- 生态集成- 无缝使用 Spring 全家桶--直接通过注解进行缓存,事务,定时任务等
- 测试友好- 便于单元测试和集成测试
- 使用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 { }
