1. 为什么选择SpringBoot整合SSM框架?
作为一个从传统SSM项目迁移到SpringBoot的老鸟,我深刻理解新手面对框架整合时的困惑。SpringBoot的出现,本质上是为了解决传统SSM(Spring + Spring MVC + MyBatis)项目中那些令人头疼的配置问题。记得2016年我第一次搭建SSM环境时,光xml配置就写了200多行,而现在用SpringBoot只需要几行配置。
SpringBoot通过自动装配机制(Auto-Configuration)将SSM三大组件的整合变得极其简单。它内置了:
- 嵌入式Tomcat(无需手动部署WAR包)
- 默认的Spring MVC配置(省去ViewResolver等bean的声明)
- MyBatis-Spring-Boot-Starter(自动配置SqlSessionFactory)
重要提示:虽然SpringBoot简化了配置,但理解底层SSM的工作原理仍然至关重要。这就像开车不需要懂发动机原理,但懂原理的司机更能应对突发状况。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与项目初始化
2.1 开发工具选择
我强烈推荐使用IntelliJ IDEA Ultimate版(社区版也够用),它对新版SpringBoot的支持最完善。以下是实测可用的环境组合:
- JDK 17(LTS版本)
- Maven 3.8.6
- SpringBoot 3.1.5
- MyBatis 3.5.13
2.2 项目骨架生成
使用Spring Initializr(https://start.spring.io/)生成项目时,务必勾选:
- Spring Web(包含Spring MVC)
- MyBatis Framework
- MySQL Driver(根据实际数据库选)
或者直接用IDEA的Spring Initializr:
- File → New → Project → Spring Initializr
- 选择Maven和Java
- 添加依赖:Web → Spring Web, SQL → MyBatis Framework
- 完成创建
生成后的pom.xml关键依赖应包含:
xml复制<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
3. 数据库配置与MyBatis整合
3.1 数据库连接配置
在application.yml中配置(比properties文件更清晰):
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC
username: root
password: yourpassword
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.demo.entity
踩坑记录:MySQL 8.0+必须指定serverTimezone,否则会报时区错误。useSSL=false在开发环境可以关闭SSL加密提升性能。
3.2 实体类和Mapper创建
实体类示例:
java复制package com.example.demo.entity;
public class User {
private Long id;
private String username;
private String email;
// getters/setters省略
}
Mapper接口(使用注解方式):
java复制@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Long id);
@Insert("INSERT INTO user(username,email) VALUES(#{username},#{email})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
}
3.3 XML映射文件配置
对于复杂SQL,建议使用XML配置。在resources/mapper/下创建UserMapper.xml:
xml复制<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="selectUsers" resultType="User">
SELECT * FROM user WHERE username LIKE CONCAT('%',#{keyword},'%')
</select>
</mapper>
4. Spring MVC控制器开发
4.1 基础REST控制器
java复制@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userMapper.findById(id);
}
@PostMapping
public ResponseEntity<String> createUser(@RequestBody User user) {
userMapper.insert(user);
return ResponseEntity.ok("User created with ID: " + user.getId());
}
}
4.2 全局异常处理
SpringBoot中统一异常处理的方式:
java复制@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return ResponseEntity.status(500)
.body("Error: " + e.getMessage());
}
}
5. 高级配置与优化技巧
5.1 MyBatis打印SQL日志
在application.yml中添加:
yaml复制logging:
level:
com.example.demo.mapper: debug
或者更详细的日志配置:
yaml复制mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
5.2 分页插件集成
使用MyBatis-Plus或PageHelper实现分页:
- 添加PageHelper依赖:
xml复制<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
- 在Service中使用:
java复制public PageInfo<User> getUsers(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectAll();
return new PageInfo<>(users);
}
5.3 事务管理
SpringBoot默认已启用事务,只需在Service方法添加注解:
java复制@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void updateUser(User user) {
userMapper.update(user);
// 其他数据库操作
}
}
6. 常见问题排查指南
6.1 启动时报"找不到Mapper"
可能原因及解决方案:
-
忘记在启动类加
@MapperScan:java复制@SpringBootApplication @MapperScan("com.example.demo.mapper") public class DemoApplication { ... } -
Mapper接口没有加
@Mapper注解 -
MyBatis的mapper-locations配置路径错误
6.2 数据库连接池配置
SpringBoot默认使用HikariCP,优化配置:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
6.3 MyBatis缓存问题
一级缓存(SqlSession级别)和二级缓存(Mapper级别)可能导致数据不一致。开发阶段建议关闭:
yaml复制mybatis:
configuration:
cache-enabled: false
local-cache-scope: statement
7. 项目结构最佳实践
推荐的标准项目结构:
code复制src/main/java
└── com.example.demo
├── config # 配置类
├── controller # MVC控制器
├── service # 业务逻辑
├── mapper # MyBatis接口
├── entity # 实体类
└── DemoApplication.java
src/main/resources
├── static # 静态资源
├── templates # 模板文件
└── application.yml # 配置文件
8. 测试方案设计
8.1 单元测试示例
java复制@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
void testInsert() {
User user = new User();
user.setUsername("test");
user.setEmail("test@example.com");
int affected = userMapper.insert(user);
assertEquals(1, affected);
assertNotNull(user.getId());
}
}
8.2 集成测试(MockMVC)
java复制@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void testGetUser() throws Exception {
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.username").exists());
}
}
9. 部署与性能调优
9.1 打包为可执行JAR
使用Maven命令:
bash复制mvn clean package
生成的jar包在target目录下,运行:
bash复制java -jar demo-0.0.1-SNAPSHOT.jar
9.2 生产环境建议
- 使用外部Tomcat时排除内置容器:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
- 启用GZIP压缩:
yaml复制server:
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,application/json
10. 扩展与进阶方向
掌握了基础整合后,可以进一步研究:
- 整合MyBatis-Plus简化CRUD
- 使用Spring Data JPA作为ORM替代方案
- 集成Redis缓存提升性能
- 结合Spring Security实现认证授权
- 使用Spring Batch处理批量数据
我在实际项目中最大的体会是:SpringBoot虽然简化了配置,但千万不要停留在"能用就行"的层面。理解每个自动配置背后的原理,才能在遇到问题时快速定位。比如知道SpringBoot是如何自动创建DataSource的,就能在连接池配置出错时知道从哪查起。
