mybatis集成spring的核心是sqlsessionfactorybean托管sqlsessionfactory;必须显式设置datasource,否则启动报nouniquebeandefinitionexception;需通过setmapperlocations指定xml路径或用@mapperscan扫描接口;事务管理器须复用同一datasource。

MyBatis 集成 Spring 的核心,是把 SqlSessionFactory 交由 Spring IoC 容器托管,而 SqlSessionFactoryBean 就是实现这一托管的关键工厂类——它不是最终的 SqlSessionFactory 实例,而是一个能生产该实例的 Spring FactoryBean。
SqlSessionFactoryBean 必须显式绑定数据源
Spring 容器中若存在多个 DataSource(如主从库、多租户场景),SqlSessionFactoryBean 不会自动选择;若未显式调用 setDataSource(),启动时将抛出 NoUniqueBeanDefinitionException。
- XML 配置中:确保
<property name="dataSource" ref="myDataSource"></property>的ref值与目标<bean id="myDataSource"></bean>完全一致 - JavaConfig 中:直接传入已声明的
@Autowired DataSource dataSource,避免字段注入或构造器未传参 - 切勿依赖 @Autowired 自动装配该属性——这是最常被忽略却导致启动失败的配置点
SqlSessionFactoryBean 要正确暴露 SqlSessionFactory 实例
SqlSessionFactoryBean 实现了 Spring 的 FactoryBean 接口,其 getObject() 方法在容器初始化后期被调用,返回真正的 SqlSessionFactory。同时它也实现了 InitializingBean,会在属性设置完成后执行 afterPropertiesSet(),完成 XML 映射文件加载、类型别名注册等初始化动作。
- Mapper XML 文件路径需通过
setMapperLocations()显式指定,例如:new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml") - 若使用注解方式(如
@Select),可省略 XML 路径,但必须保证 Mapper 接口被正确扫描 - 该 Bean 在容器中默认以方法名(如
sqlSessionFactory)为 beanName,Service 层可通过@Autowired SqlSessionFactory直接注入(较少见),更常用的是注入 Mapper 接口
Mapper 接口需由 Spring 代理并注入容器
MyBatis 的 Mapper 接口本身没有实现类,Spring 通过 MapperScannerConfigurer(XML)或 @MapperScan(注解)自动扫描接口,为每个接口生成动态代理对象,并注册为 Spring Bean。
- @MapperScan("com.example.mapper") 应写在配置类上,包路径要准确,不支持 Ant 风格通配符如
com.**.mapper - 代理对象底层依赖 SqlSessionFactory,因此必须确保 SqlSessionFactoryBean 已初始化完成——Spring 会自动处理这个依赖顺序
- DAO 层不再需要手动 new SqlSession 或调用 getMapper(),Service 层可直接
@Autowired UserMapper userMapper
事务管理器必须与 SqlSessionFactory 共享同一 DataSource
事务能否生效,取决于 DataSourceTransactionManager 是否使用和 SqlSessionFactoryBean 完全相同的 DataSource 实例。
- 务必使用
org.springframework.jdbc.datasource.DataSourceTransactionManager,而非 JtaTransactionManager(后者适用于分布式事务,对单数据源无效且静默失效) - XML 中检查:
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="myDataSource"></property></bean> - JavaConfig 中应复用同一个 dataSource 对象:
return new DataSourceTransactionManager(dataSource); - 事务注解
@Transactional只在 Spring 代理的方法上调用才有效,自调用(this.method())不会触发事务
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











