在当前快速迭代的软件开发环境中,掌握主流技术栈并将其应用于实际项目中,是每一位开发者成长的关键路径。本文记录了笔者在使用SSM(Spring + Spring MVC + MyBatis)框架开发一个企业级管理系统过程中的详细开发日记,涵盖从环境搭建、模块设计到部署上线的全流程实践,旨在为初学者提供一份可复用的技术文档与经验参考。
一、项目背景与目标设定
本次开发的系统是一个面向中小企业的内部管理平台,主要功能包括员工信息管理、部门组织架构、考勤记录、请假审批、公告发布等模块。我们选择SSM框架作为核心技术栈,因其结构清晰、易于维护、社区支持广泛,非常适合中小型团队进行快速开发与迭代。
1. 技术选型理由
- Spring:负责IoC容器和事务管理,实现组件解耦与依赖注入。
- Spring MVC:处理HTTP请求响应,支持RESTful风格接口设计。
- MyBatis:轻量级ORM框架,灵活控制SQL语句,适合复杂查询场景。
2. 开发目标
- 搭建稳定可靠的开发环境,确保前后端分离架构清晰。
- 完成核心业务模块的CRUD操作,并实现权限控制机制。
- 引入日志记录、异常处理、数据校验等非功能性需求。
- 最终部署至Linux服务器,实现灰度发布与持续集成。
二、开发初期准备:环境搭建与项目初始化
项目启动的第一步是配置开发环境。我们采用IntelliJ IDEA作为IDE,Maven作为构建工具,MySQL作为数据库,Tomcat作为Web服务器。
1. Maven多模块结构设计
为了便于后期维护和扩展,我们将项目拆分为三个模块:
ssm-core:包含实体类、DAO接口、Mapper XML文件及通用工具类。ssm-service:封装业务逻辑,调用DAO层方法,提供服务接口。ssm-web:Spring MVC控制器层,处理前端请求并返回JSON或视图。
2. 数据库设计与初始化脚本
根据需求分析,我们设计了以下表结构:
CREATE TABLE t_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, dept_id BIGINT, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE t_dept ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL );
通过编写SQL脚本自动初始化测试数据,方便后续单元测试与接口调试。
三、核心功能开发:以用户管理为例
我们选取“用户管理”模块作为第一个落地的功能点,逐步推进其他模块开发。
1. DAO层实现(MyBatis)
在ssm-core模块中创建UserMapper接口:
public interface UserMapper {
@Select("SELECT * FROM t_user WHERE id = #{id}")
User findById(Long id);
@Insert("INSERT INTO t_user(username, password, dept_id) VALUES(#{username}, #{password}, #{deptId})")
void insert(User user);
@Update("UPDATE t_user SET username=#{username}, dept_id=#{deptId} WHERE id=#{id}")
void update(User user);
@Delete("DELETE FROM t_user WHERE id=#{id}")
void deleteById(Long id);
}
同时,在resources目录下编写对应的XML映射文件,用于更复杂的SQL语句。
2. Service层封装(Spring)
UserService类中注入UserMapper,并添加事务注解:
@Service
@Transactional
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Long id) {
return userMapper.findById(id);
}
public void saveUser(User user) {
userMapper.insert(user);
}
public void updateUser(User user) {
userMapper.update(user);
}
public void deleteUser(Long id) {
userMapper.deleteById(id);
}
}
3. Controller层暴露API(Spring MVC)
在ssm-web模块中定义UserController:
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.getUserById(id);
return ResponseEntity.ok(user);
}
@PostMapping
public ResponseEntity<String> createUser(@RequestBody User user) {
try {
userService.saveUser(user);
return ResponseEntity.ok("Success");
} catch (Exception e) {
return ResponseEntity.status(500).body("Failed to save user");
}
}
}
四、进阶特性开发:权限控制与异常处理
随着功能完善,我们开始关注系统的健壮性和安全性。
1. 权限拦截器(Interceptor)
基于Spring MVC的HandlerInterceptor机制,实现登录状态验证:
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("currentUser");
if (user == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
注册该拦截器到Spring MVC配置中,确保未登录用户无法访问敏感接口。
2. 全局异常处理器(@ControllerAdvice)
统一捕获运行时异常,返回友好的错误提示:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGeneralException(Exception ex) {
return ResponseEntity.status(500).body("Internal Server Error: " + ex.getMessage());
}
}
结合Logback日志框架记录异常堆栈,便于排查问题。
五、测试与部署:保证质量与可用性
开发完成后,必须进行全面测试才能交付生产环境。
1. 单元测试(JUnit + Mockito)
对UserService进行Mock测试:
@Test
public void testSaveUser() {
when(mockUserMapper.insert(any(User.class))).thenReturn(1);
String result = userService.saveUser(new User("test", "123", 1L));
assertEquals("Success", result);
}
确保每个Service方法都能独立验证其正确性。
2. 集成测试(Postman / Swagger)
利用Swagger UI生成API文档,配合Postman手动测试接口连通性与参数合法性。
3. Docker化部署(Linux服务器)
将WAR包打包后放入Docker容器,简化部署流程:
FROM tomcat:9.0-jdk8 COPY target/ssm-web.war /usr/local/tomcat/webapps/ EXPOSE 8080 CMD ["catalina.sh", "run"]
通过Nginx反向代理对外暴露服务,提高性能与安全性。
六、总结与反思:收获与改进方向
经过两个月的开发周期,该项目成功上线并投入使用。期间我们积累了宝贵的实践经验,也发现了若干可以优化的空间:
- 初期缺乏代码规范意识,导致部分命名混乱;建议引入Checkstyle强制统一编码风格。
- 未充分考虑缓存机制,高频查询存在性能瓶颈;后续可引入Redis提升响应速度。
- 前端与后端协作效率低,建议使用前后端分离架构(Vue + REST API)进一步解耦。
总的来说,这次SSM框架项目开发不仅锻炼了我们的工程能力,也让我们更加理解了企业级应用的设计思想——稳定、可扩展、易维护才是长期价值所在。

