1. 项目概述
SpringBoot整合Mybatis是Java后端开发中最经典的技术组合之一。作为从业十年的老码农,我见证了这个技术栈从最初的配置繁琐到现在的开箱即用。这种组合既能享受SpringBoot的快速启动优势,又能发挥Mybatis灵活的SQL控制能力,特别适合需要精细控制SQL又追求开发效率的中大型项目。
在实际企业开发中,约80%的Java项目都会采用这种架构方案。不同于JPA的全自动ORM,Mybatis保留了原生SQL的灵活性,这对复杂查询、性能优化和遗留系统改造尤为重要。而SpringBoot的自动配置机制,则让原本需要数十行XML配置的Mybatis变得极其轻量。
2. 技术选型分析
2.1 为什么选择这个技术栈
在微服务架构下,我们通常需要:
- 快速搭建服务脚手架
- 精细控制数据库操作
- 与现有Spring生态无缝集成
SpringBoot+Mybatis完美满足这些需求。对比其他方案:
- JPA+Hibernate:适合简单CRUD,但复杂SQL编写困难
- JDBC:过于底层,开发效率低
- MyBatis-Plus:虽然功能强大,但学习成本较高
2.2 版本兼容性要点
经过多个项目验证,推荐使用:
- SpringBoot 2.7.x(LTS版本)
- Mybatis 3.5.x
- Mybatis-Spring 2.1.x
特别注意:SpringBoot 3.x需要JDK17+,对老项目不友好。如果使用SpringBoot 3.x,需要配套mybatis-spring-boot-starter 3.0+
3. 详细整合步骤
3.1 项目初始化
使用Spring Initializr创建项目时勾选:
- Spring Web
- MyBatis Framework
- MySQL Driver
或者手动添加依赖:
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.1</version> </dependency>3.2 数据源配置
application.yml典型配置:
spring: datasource: url: jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 20 minimum-idle: 53.3 Mybatis配置
创建配置类:
@Configuration @MapperScan("com.example.mapper") public class MybatisConfig { @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> { configuration.setMapUnderscoreToCamelCase(true); configuration.setDefaultFetchSize(100); configuration.setDefaultStatementTimeout(30); }; } }4. 核心功能实现
4.1 Mapper接口开发
推荐使用注解方式:
@Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User findById(@Param("id") Long id); @Insert("INSERT INTO user(name,age) VALUES(#{name},#{age})") @Options(useGeneratedKeys = true, keyProperty = "id") int insert(User user); }4.2 动态SQL实践
XML方式更适合复杂场景:
<select id="searchUsers" resultType="User"> SELECT * FROM user <where> <if test="name != null"> AND name LIKE CONCAT('%',#{name},'%') </if> <if test="minAge != null"> AND age >= #{minAge} </if> </where> ORDER BY id DESC </select>5. 高级特性应用
5.1 多数据源配置
对于分库分表场景:
@Configuration @MapperScan(basePackages = "com.example.db1.mapper", sqlSessionFactoryRef = "db1SqlSessionFactory") public class Db1Config { @Bean @ConfigurationProperties("spring.datasource.db1") public DataSource db1DataSource() { return DataSourceBuilder.create().build(); } @Bean public SqlSessionFactory db1SqlSessionFactory() throws Exception { SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); factory.setDataSource(db1DataSource()); return factory.getObject(); } }5.2 二级缓存集成
启用Redis缓存:
@Bean public Cache redisCache() { return new RedisCache("myCache", RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(30))); }6. 性能优化实践
6.1 SQL执行监控
添加P6Spy拦截器:
# application.properties spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver spring.datasource.url=jdbc:p6spy:mysql://localhost:3306/demo6.2 批量操作优化
使用BatchExecutor:
@Bean public Executor executor(DataSource dataSource) { return new BatchExecutor(dataSource); }7. 常见问题排查
7.1 典型异常处理
- BindingException检查:
- Mapper接口是否添加@Mapper注解
- XML namespace是否与接口全限定名一致
- 方法名是否与XML id匹配
- 事务失效场景:
- 检查是否添加@Transactional
- 确认方法是否为public
- 避免同类内方法调用
7.2 日志配置技巧
开启完整SQL日志:
logging: level: org.mybatis: DEBUG java.sql: DEBUG org.springframework.jdbc: DEBUG8. 生产环境建议
- 连接池配置:
- 根据QPS设置maxPoolSize
- 设置合理的超时时间
- 开启连接健康检查
- Mybatis最佳实践:
- 使用ResultMap避免N+1查询
- 复杂SQL优先使用XML配置
- 批量操作使用Batch模式
- 监控指标:
- SQL执行时间监控
- 慢查询阈值设置
- 连接池使用率告警
在实际项目中,我们通常会结合Spring Actuator和Prometheus对这些指标进行监控。通过Grafana面板可以直观看到SQL执行效率变化,这对性能调优非常重要。