Spring MVC+MyBatis全栈开发实战指南:从原理到企业级应用

一、框架基础与环境搭建

1.1 开发环境准备

现代Java Web开发需构建标准化环境,建议采用JDK 11+、Maven 3.6+和IntelliJ IDEA组合。通过Maven配置统一管理依赖版本,示例pom.xml核心配置如下:

  1. <properties>
  2. <spring.version>5.3.20</spring.version>
  3. <mybatis.version>3.5.9</mybatis.version>
  4. </properties>
  5. <dependencies>
  6. <!-- Spring MVC核心依赖 -->
  7. <dependency>
  8. <groupId>org.springframework</groupId>
  9. <artifactId>spring-webmvc</artifactId>
  10. <version>${spring.version}</version>
  11. </dependency>
  12. <!-- MyBatis核心依赖 -->
  13. <dependency>
  14. <groupId>org.mybatis</groupId>
  15. <artifactId>mybatis</artifactId>
  16. <version>${mybatis.version}</version>
  17. </dependency>
  18. </dependencies>

1.2 IoC容器原理剖析

Spring IoC容器通过反射机制实现对象生命周期管理,其核心流程包含:

  1. 配置元数据解析(XML/注解/Java Config)
  2. BeanDefinition注册
  3. 依赖注入(setter/构造器注入)
  4. 初始化回调(InitializingBean接口)

典型配置示例:

  1. @Configuration
  2. public class AppConfig {
  3. @Bean
  4. public DataSource dataSource() {
  5. return new DriverManagerDataSource("jdbc:mysql://localhost:3306/demo", "user", "pass");
  6. }
  7. @Bean
  8. @Scope("prototype")
  9. public UserService userService() {
  10. return new UserServiceImpl(dataSource());
  11. }
  12. }

1.3 AOP实现机制

基于动态代理的AOP实现包含两种模式:

  • JDK动态代理:适用于接口实现类
  • CGLIB代理:通过继承目标类实现代理

典型切面配置:

  1. @Aspect
  2. @Component
  3. public class LoggingAspect {
  4. @Before("execution(* com.demo.service.*.*(..))")
  5. public void logBefore(JoinPoint joinPoint) {
  6. System.out.println("Method called: " + joinPoint.getSignature());
  7. }
  8. }

二、Spring MVC核心组件

2.1 请求处理流程

完整的请求生命周期包含:

  1. DispatcherServlet接收请求
  2. HandlerMapping定位处理器
  3. HandlerAdapter执行处理
  4. ViewResolver解析视图
  5. 响应返回客户端

关键组件配置示例:

  1. @Configuration
  2. public class WebConfig implements WebMvcConfigurer {
  3. @Override
  4. public void addViewControllers(ViewControllerRegistry registry) {
  5. registry.addViewController("/").setViewName("index");
  6. }
  7. @Bean
  8. public ViewResolver viewResolver() {
  9. InternalResourceViewResolver resolver = new InternalResourceViewResolver();
  10. resolver.setPrefix("/WEB-INF/views/");
  11. resolver.setSuffix(".jsp");
  12. return resolver;
  13. }
  14. }

2.2 异常处理体系

推荐采用@ControllerAdvice实现全局异常处理:

  1. @ControllerAdvice
  2. public class GlobalExceptionHandler {
  3. @ExceptionHandler(DataAccessException.class)
  4. public ResponseEntity<ErrorResponse> handleDataAccess(DataAccessException ex) {
  5. return ResponseEntity.status(500)
  6. .body(new ErrorResponse("DB_ERROR", ex.getMessage()));
  7. }
  8. }

2.3 拦截器应用

通过实现HandlerInterceptor接口实现请求拦截:

  1. public class AuthInterceptor implements HandlerInterceptor {
  2. @Override
  3. public boolean preHandle(HttpServletRequest request,
  4. HttpServletResponse response,
  5. Object handler) {
  6. if (request.getSession().getAttribute("user") == null) {
  7. response.sendRedirect("/login");
  8. return false;
  9. }
  10. return true;
  11. }
  12. }

三、MyBatis高级特性

3.1 动态SQL构建

MyBatis提供强大的动态SQL支持,典型场景包括:

  • 条件查询:<if><choose>标签
  • 批量操作:<foreach>标签
  • 结果映射:<resultMap>配置

示例动态查询:

  1. <select id="findUsers" resultType="User">
  2. SELECT * FROM users
  3. <where>
  4. <if test="name != null">
  5. AND name LIKE #{name}
  6. </if>
  7. <if test="minAge != null">
  8. AND age >= #{minAge}
  9. </if>
  10. </where>
  11. </select>

3.2 事务管理策略

推荐采用声明式事务管理:

  1. @Service
  2. public class OrderServiceImpl implements OrderService {
  3. @Autowired
  4. private OrderMapper orderMapper;
  5. @Transactional(propagation = Propagation.REQUIRED,
  6. isolation = Isolation.READ_COMMITTED)
  7. @Override
  8. public void createOrder(Order order) {
  9. orderMapper.insert(order);
  10. // 其他业务操作
  11. }
  12. }

3.3 缓存机制优化

二级缓存配置示例:

  1. <settings>
  2. <setting name="cacheEnabled" value="true"/>
  3. </settings>
  4. <mapper namespace="com.demo.mapper.UserMapper">
  5. <cache eviction="FIFO" flushInterval="60000" size="512"/>
  6. </mapper>

四、企业级项目实践

4.1 电子邮件系统开发

系统架构包含:

  • 前端:Thymeleaf模板引擎
  • 后端:Spring MVC控制器
  • 持久层:MyBatis邮件模板管理
  • 异步处理:消息队列实现邮件发送

关键代码片段:

  1. @Service
  2. public class EmailServiceImpl implements EmailService {
  3. @Autowired
  4. private JavaMailSender mailSender;
  5. @Async
  6. @Override
  7. public void sendAsync(EmailMessage message) {
  8. SimpleMailMessage mail = new SimpleMailMessage();
  9. mail.setTo(message.getTo());
  10. mail.setSubject(message.getSubject());
  11. mail.setText(message.getContent());
  12. mailSender.send(mail);
  13. }
  14. }

4.2 图书管理系统实现

系统核心模块:

  • 用户认证模块
  • 图书管理模块
  • 借阅记录模块
  • 统计报表模块

数据库设计示例:

  1. CREATE TABLE books (
  2. id BIGINT PRIMARY KEY AUTO_INCREMENT,
  3. title VARCHAR(100) NOT NULL,
  4. author VARCHAR(50),
  5. status TINYINT DEFAULT 0
  6. );
  7. CREATE TABLE borrow_records (
  8. id BIGINT PRIMARY KEY AUTO_INCREMENT,
  9. book_id BIGINT NOT NULL,
  10. user_id BIGINT NOT NULL,
  11. borrow_date DATETIME NOT NULL,
  12. return_date DATETIME,
  13. FOREIGN KEY (book_id) REFERENCES books(id)
  14. );

4.3 财务管理系统架构

系统采用微服务架构设计:

  • 账户服务:管理用户资金账户
  • 交易服务:处理资金转账业务
  • 账单服务:生成交易明细报表
  • 对账服务:每日交易数据核对

分布式事务处理方案:

  1. @GlobalTransactional
  2. public void transfer(Long fromId, Long toId, BigDecimal amount) {
  3. accountService.debit(fromId, amount);
  4. accountService.credit(toId, amount);
  5. transactionService.record(fromId, toId, amount);
  6. }

五、性能优化与最佳实践

5.1 SQL优化策略

  • 避免SELECT *,明确指定查询字段
  • 合理使用索引,控制索引数量
  • 批量操作替代循环单条操作
  • 避免在WHERE子句中使用函数

5.2 缓存使用建议

  • 热点数据优先缓存
  • 设置合理的过期时间
  • 避免缓存雪崩(随机过期时间)
  • 防止缓存穿透(空值缓存)

5.3 并发控制方案

  • 乐观锁实现:
    1. UPDATE accounts SET balance = balance - #{amount}, version = version + 1
    2. WHERE id = #{id} AND version = #{version}
  • 分布式锁实现:基于Redis的SETNX命令

本文通过系统化的知识体系构建,结合三个完整项目案例,帮助开发者全面掌握Spring MVC+MyBatis框架的开发精髓。配套资源包含完整项目源码、数据库脚本及开发文档,助力快速提升企业级应用开发能力。