Spring与MyBatis整合实战与配置详解 📅 发布时间:2026/9/14 23:43:46 👁 浏览次数: 1. 项目概述Spring与MyBatis整合是Java企业级开发中最常见的框架组合方案之一。作为两个最主流的开源框架Spring的IoC容器和事务管理能力与MyBatis灵活的SQL映射特性形成了完美互补。这种组合既能享受Spring生态的便利又能保留MyBatis对SQL的精细控制权。在实际项目中我发现很多开发者虽然能够完成基础整合但对整合过程中的关键配置项理解不够深入导致后期遇到事务失效、Mapper注入失败等问题时无从排查。本文将基于最新稳定版本Spring 5.3.x MyBatis 3.5.x通过一个完整的图书管理系统案例详解整合过程中的技术细节和避坑指南。2. 环境准备与依赖配置2.1 开发环境要求JDK 1.8Maven 3.6MySQL 5.7IDEIntelliJ IDEA或Eclipse2.2 Maven依赖配置在pom.xml中需要配置以下核心依赖properties spring.version5.3.23/spring.version mybatis.version3.5.10/mybatis.version mybatis.spring.version2.0.7/mybatis.spring.version /properties dependencies !-- Spring核心 -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version${spring.version}/version /dependency !-- Spring JDBC -- dependency groupIdorg.springframework/groupId artifactIdspring-jdbc/artifactId version${spring.version}/version /dependency !-- MyBatis核心 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version${mybatis.version}/version /dependency !-- MyBatis-Spring整合包 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version${mybatis.spring.version}/version /dependency !-- 数据库连接池 -- dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.2.11/version /dependency !-- MySQL驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.30/version /dependency /dependencies注意mybatis-spring的版本需要与MyBatis核心版本匹配否则会出现兼容性问题。建议使用mybatis-spring-boot-starter中定义的版本对应关系。3. 核心配置详解3.1 数据源配置创建jdbc.properties文件配置数据库连接jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/ssm?useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456在Spring配置文件中配置Druid数据源!-- 加载properties文件 -- context:property-placeholder locationclasspath:jdbc.properties/ !-- 配置Druid数据源 -- bean iddataSource classcom.alibaba.druid.pool.DruidDataSource init-methodinit destroy-methodclose property namedriverClassName value${jdbc.driver}/ property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ !-- 连接池配置 -- property nameinitialSize value5/ property nameminIdle value5/ property namemaxActive value20/ property namemaxWait value60000/ /bean3.2 SqlSessionFactory配置SqlSessionFactory是MyBatis的核心对象需要通过Spring进行管理bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean !-- 注入数据源 -- property namedataSource refdataSource/ !-- 配置MyBatis全局配置文件 -- property nameconfigLocation valueclasspath:mybatis-config.xml/ !-- 配置Mapper映射文件位置 -- property namemapperLocations valueclasspath:mapper/*.xml/ !-- 配置类型别名包 -- property nametypeAliasesPackage valuecom.example.entity/ /bean3.3 Mapper接口扫描MyBatis-Spring提供了MapperScannerConfigurer来自动扫描Mapper接口bean classorg.mybatis.spring.mapper.MapperScannerConfigurer !-- 指定扫描的包路径 -- property namebasePackage valuecom.example.mapper/ !-- 可选指定特定的SqlSessionFactory -- property namesqlSessionFactoryBeanName valuesqlSessionFactory/ /bean4. 事务管理配置4.1 声明式事务配置Spring的事务管理是整合中的关键环节!-- 开启注解驱动的事务管理 -- tx:annotation-driven transaction-managertransactionManager/ !-- 配置事务管理器 -- bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource/ /bean4.2 事务传播行为在Service层使用Transactional注解Service public class BookServiceImpl implements BookService { Autowired private BookMapper bookMapper; Transactional(propagation Propagation.REQUIRED, isolation Isolation.DEFAULT, timeout 30, rollbackFor Exception.class) public void saveBook(Book book) { bookMapper.insert(book); } }5. 完整项目结构标准的SSM整合项目结构如下src/main/java com.example controller # 控制层 service # 业务层 mapper # 持久层 entity # 实体类 src/main/resources config spring.xml # Spring主配置 mybatis-config.xml # MyBatis配置 mapper # Mapper XML文件 jdbc.properties # 数据库配置6. 常见问题排查6.1 Mapper注入失败可能原因及解决方案Mapper接口未添加Mapper注解或在配置中未扫描到Mapper.xml文件未正确放置或未在配置中指定SqlSessionFactory配置错误6.2 事务不生效检查要点是否在Spring配置中启用了 tx:annotation-driven事务方法是否为public是否在同一个类中调用事务方法6.3 性能优化建议合理配置连接池参数使用二级缓存时注意缓存策略批量操作使用BatchExecutor7. 高级配置技巧7.1 多数据源配置当需要连接多个数据库时!-- 主数据源 -- bean idmasterDataSource classcom.alibaba.druid.pool.DruidDataSource !-- 配置略 -- /bean !-- 从数据源 -- bean idslaveDataSource classcom.alibaba.druid.pool.DruidDataSource !-- 配置略 -- /bean !-- 主SqlSessionFactory -- bean idmasterSqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refmasterDataSource/ /bean !-- 从SqlSessionFactory -- bean idslaveSqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refslaveDataSource/ /bean7.2 动态数据源切换通过AbstractRoutingDataSource实现public class DynamicDataSource extends AbstractRoutingDataSource { Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceType(); } }8. 测试验证编写集成测试验证配置RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(locations classpath:config/spring.xml) public class BookServiceTest { Autowired private BookService bookService; Test public void testFindBookById() { Book book bookService.findBookById(1); Assert.assertNotNull(book); } }在实际项目开发中Spring与MyBatis的整合虽然看似简单但每个配置项背后都有其设计考量。建议开发者不仅要掌握配置方法更要理解每个配置项的作用原理这样才能在遇到问题时快速定位和解决。