MyBatis与Spring整合优化实战指南:从配置到性能调优
一、SqlSessionFactory配置最佳实践
1.1 数据源配置优化
<!-- Spring配置示例 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb?useSSL=false"/><property name="username" value="root"/><property name="password" value="secret"/><!-- HikariCP核心参数 --><property name="maximumPoolSize" value="20"/><property name="connectionTimeout" value="30000"/><property name="idleTimeout" value="600000"/><property name="maxLifetime" value="1800000"/>
</bean>
1.2 MyBatis核心配置
<!-- mybatis-config.xml -->
<configuration><settings><setting name="mapUnderscoreToCamelCase" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/></settings><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="helperDialect" value="mysql"/><property name="reasonable" value="true"/></plugin></plugins>
</configuration>
1.3 Spring整合配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="configLocation" value="classpath:mybatis-config.xml"/><property name="mapperLocations" value="classpath*:mapper/**/*.xml"/>
</bean>
二、事务管理深度解析
2.1 声明式事务配置
@Configuration
@EnableTransactionManagement
public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Beanpublic TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {return new TransactionTemplate(transactionManager);}
}
@Service
public class UserService {@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,rollbackFor = Exception.class)public void updateUser(User user) {// 业务逻辑}
}
2.2 编程式事务模板
@Autowired
private TransactionTemplate transactionTemplate;public void batchUpdate(List<User> users) {transactionTemplate.execute(status -> {users.forEach(user -> {userMapper.update(user);});return true;});
}
三、N+1查询问题解决方案
3.1 联表查询优化
<!-- PostMapper.xml -->
<select id="selectPostsWithComments" resultMap="PostResultMap">SELECT p.*, c.*FROM post pLEFT JOIN comment c ON p.id = c.post_id
</select><resultMap id="PostResultMap" type="Post"><id property="id" column="id"/><result property="title" column="title"/><collection property="comments" ofType="Comment"><id property="id" column="comment_id"/><result property="content" column="content"/></collection>
</resultMap>
3.2 延迟加载策略
<!-- 局部延迟加载配置 -->
<resultMap id="UserResultMap" type="User"><association property="department" javaType="Department"select="com.example.mapper.DepartmentMapper.selectById"column="dept_id"fetchType="lazy"/>
</resultMap>
3.3 批量查询优化
// 使用BatchExecutor
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {UserMapper mapper = sqlSession.getMapper(UserMapper.class);users.forEach(user -> {mapper.update(user);});sqlSession.commit();
}
四、性能调优实践
4.1 分页查询优化
// 使用PageHelper
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(users);
4.2 缓存配置
<!-- 二级缓存配置 -->
<cache eviction="LRU"flushInterval="60000"size="512"readOnly="true"/>
4.3 执行计划分析
EXPLAIN SELECT p.*, c.*
FROM post p
LEFT JOIN comment c ON p.id = c.post_id
WHERE p.create_time > '2025-01-01';
五、常见问题解决方案
5.1 连接泄漏处理
@Bean
public DataSource dataSource() {HikariDataSource ds = new HikariDataSource();ds.setLeakDetectionThreshold(30000); // 30秒泄漏检测return ds;
}
5.2 事务未生效排查
- 检查
@Transactional
注解是否在public方法上 - 确认是否启用了
@EnableTransactionManagement
- 验证数据库引擎是否支持事务(如InnoDB)
5.3 延迟加载失效处理
<!-- 强制使用CGLIB代理 -->
<setting name="proxyFactory" value="CGLIB"/>
六、总结
通过合理配置SqlSessionFactory、选择合适的事务管理方式,以及采用联表查询、延迟加载等技术手段,可以有效解决MyBatis与Spring整合中的性能瓶颈。实际开发中应根据具体场景权衡配置,建议通过压测工具(如JMeter)持续优化数据库访问性能。