- 以下是针对SSM(Spring + Spring MVC + MyBatis)框架的去Spring MVC强化版学习路线,通过「分层递进」+「项目驱动」的方式快速掌握核心技能:
一、分阶段学习重点(弱化Spring MVC)
???? 第一阶段:MyBatis核心(3天)
-
原生MyBatis手写
- 用
SqlSessionFactoryBuilder
手动构建SQL会话 - 手写Mapper.xml实现CRUD
- 动态SQL实践:
<if> <foreach> <choose>
<select id="findUsers" resultType="User"> SELECT * FROM users <where> <if test="name != null">AND name = #{name}</if> <if test="age != null">AND age > #{age}</if> </where> </select>
- 用
-
进阶技巧
- 一对一/一对多关联查询(嵌套结果 vs 嵌套查询)
- 二级缓存配置与Redis集成
- 插件开发(实现分页拦截器)
???? 第二阶段:Spring IoC深度(2天)
-
抛弃XML用纯注解
-
@Configuration
+@Bean
替代XML配置 - 条件装配
@Conditional
实现多环境配置
@Bean @Profile("dev") // 仅开发环境生效 public DataSource devDataSource() { ... }
-
-
AOP实战
- 用
@Around
实现接口耗时监控 - 自定义注解实现日志切面
@Around("@annotation(com.example.LogExecutionTime)") public Object logTime(ProceedingJoinPoint pjp) throws Throwable { long start = System.currentTimeMillis(); Object result = pjp.proceed(); System.out.println("耗时:" + (System.currentTimeMillis() - start)); return result; }
- 用
???? 第三阶段:SSM整合(5天)
-
去Web化整合方案
- 用
@ComponentScan
替代<context:component-scan>
- 纯JavaConfig配置(无web.xml)
@Configuration @Import({MyBatisConfig.class, TransactionConfig.class}) @PropertySource("classpath:db.properties") public class AppConfig { ... }
- 用
-
事务强化训练
- 编程式事务
TransactionTemplate
实战 - 声明式事务传播行为实验(REQUIRED vs REQUIRES_NEW)
- 编程式事务
二、推荐练手项目(弱化Controller层)
???? 项目1:库存管理系统(重点:MyBatis优化)
-
技术要点:
- 动态数据源切换(主从库分离)
- MyBatis批处理操作
@Transactional public void batchInsert(List<Product> products) { SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH); ProductMapper mapper = session.getMapper(ProductMapper.class); products.forEach(mapper::insert); session.commit(); }
-
挑战任务:
- 实现悲观锁(SELECT FOR UPDATE)
- 库存扣减的幂等性设计
???? 项目2:电商订单系统(重点:事务与缓存)
-
技术要点:
- Spring声明式事务嵌套
- Caffeine本地缓存集成
<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.1.8</version> </dependency>
-
挑战任务:
- 实现订单拆分事务(多个子订单原子性)
- 缓存击穿解决方案(互斥锁实现)
三、学习资源推荐
-
必备工具链:
- MyBatis Generator(逆向工程)
- Arthas(线上诊断工具)
-
调试技巧:
// 查看MyBatis最终执行的SQL @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> configuration.setLogImpl(StdOutImpl.class); }
-
学习资料:
- 官方文档优先:
- MyBatis官方文档
- Spring Framework 5.3 Doc
- 视频教程:
- 尚硅谷2023版SSM教程(重点看MyBatis+Spring部分)
- 黑马程序员MyBatis强化班
- 官方文档优先:
四、高频问题解决方案
-
Mapper注入失败:
- 检查
@MapperScan
路径是否正确 - 确认MyBatis-Spring版本兼容性
- 检查
-
事务不生效:
- 确认是否抛出非受检异常(RuntimeException)
- 检查方法是否为public且未被final修饰
-
性能优化:
EXPLAIN SELECT * FROM orders WHERE user_id = 1001 -- SQL分析
- 慢查询日志配置
- MyBatis开启驼峰映射:
mybatis.configuration.map-underscore-to-camel-case=true
- 通过这种「剥离Spring MVC」的学习方式,可以更聚焦于Spring核心机制与MyBatis的高级特性。建议每个阶段完成后,用JMeter做压力测试,观察不同实现方式的性能差异,加深理解。