基于SSM框架的个人收支统计分析系统 - 源码深度解析
在当今数字化财务管理时代,一款高效、直观的财务辅助工具对个人理财至关重要。本文深入剖析基于SSM(Spring + Spring MVC + MyBatis)框架构建的个人财务分析系统,从架构设计到核心功能实现,为您提供全方位的技术解析。
系统架构与技术栈选型
整体架构设计
该系统采用经典的三层架构模式,确保业务逻辑清晰分离:
- 表示层:基于JSP动态页面技术,结合JavaScript图表库实现数据可视化
- 业务逻辑层:Spring框架为核心,通过依赖注入管理业务组件
- 数据持久层:MyBatis框架负责数据库操作,提供灵活的SQL映射能力
技术栈配置详解
<!-- Spring MVC核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
<!-- MyBatis与Spring集成 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- Druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
架构优势:Spring的IoC容器实现组件松耦合,AOP支持横切关注点处理;MyBatis提供SQL与代码的清晰分离,便于优化和调试。
数据库设计精要分析
核心表结构设计
收支记录表(shouzhi_record)优化策略
CREATE TABLE `shouzhi_record` (
`szrid` int(11) NOT NULL AUTO_INCREMENT,
`szr_num` int(11) DEFAULT NULL COMMENT '收支金额',
`user_id` int(11) DEFAULT NULL COMMENT '用户ID',
`szr_date` varchar(255) DEFAULT NULL COMMENT '收支日期',
`szr_comment` varchar(255) DEFAULT NULL COMMENT '收支备注',
`shouzhiCategory` varchar(255) DEFAULT NULL COMMENT '收支分类',
`shouzhi_category_id` int(11) DEFAULT NULL COMMENT '收支分类ID',
PRIMARY KEY (`szrid`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='收支记录表'
设计亮点深度解析:
双重分类标识机制
- 同时存储分类名称和分类ID,兼顾查询效率与数据完整性
- 避免因分类信息变更导致的历史数据不一致问题
金额存储优化方案
- 采用int类型存储,以分为单位,彻底解决浮点数精度问题
- 实际应用中通过业务层进行元与分的转换处理
索引策略建议
- 推荐在(user_id, szr_date)字段建立复合索引
- 支持高效的时间范围查询和用户数据隔离
分类表(shouzhi_category)层级设计
CREATE TABLE `shouzhi_category` (
`szcid` int(11) NOT NULL AUTO_INCREMENT,
`parent_category` varchar(255) DEFAULT NULL COMMENT '父分类',
`son_category` varchar(255) DEFAULT NULL COMMENT '子分类',
PRIMARY KEY (`szcid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='收支分类表'
设计特色:支持无限级分类扩展,如"生活开销→餐饮→早餐"的多级结构,为精细化财务分析提供数据基础。

核心功能实现深度解析
1. 智能预算管理模块
预算管理模块通过BudgetController实现完整的预算生命周期管理:
@Controller
@RequestMapping("/budget")
public class BudgetController {
@Autowired
private BudgetService budgetService;
/**
* 查询当前用户月度预算
*/
@RequestMapping("/findBudget.action")
public String findBudget(HttpServletRequest request, Model model){
String currentMonth = getCurrentTime(); // 获取当前月份
User user = (User) request.getSession().getAttribute("user");
int uid = user.getUid(); // 从会话获取用户ID
Budget budget = new Budget();
budget.setUser_id(uid);
budget.setWtime(currentMonth);
// 查询当前月份预算信息
Budget findBudget = budgetService.findBudget(budget);
model.addAttribute("budget", findBudget);
return "/jsp/financialBudget.jsp";
}
/**
* 添加/更新预算(Ajax接口)
*/
@RequestMapping("/addBudget.action")
@ResponseBody
public String addBudget(Budget budget){
budget.setWtime(getCurrentTime()); // 设置预算月份
budgetService.addBudget(budget); // 持久化预算数据
return "OK";
}
/**
* 获取当前年月(线程安全的SimpleDateFormat使用)
*/
private String getCurrentTime(){
Date time = new Date();
DateFormat dFormat = new SimpleDateFormat("yyyy-MM");
return dFormat.format(time);
}
}
技术实现精髓:
- 会话安全管理:通过HttpSession确保用户数据隔离,防止越权访问
- 时间处理优化:使用SimpleDateFormat进行精确到月份的时间格式化
- 异步交互设计:@ResponseBody注解支持Ajax异步请求,提升用户体验
- RESTful风格:URL映射符合REST设计原则,接口清晰易懂

2. 收支记录与分类统计模块
Service层采用面向接口编程,实现业务逻辑与数据访问的彻底分离:
@Service
public class ShouzhiRecordService {
@Autowired
private ShouzhiRecordMapper recordMapper;
/**
* 按时间范围查询收支记录
*/
public List<ShouzhiRecord> findByUserIdAndDateRange(Integer userId,
String startDate,
String endDate) {
Map<String, Object> params = new HashMap<>();
params.put("userId", userId);
params.put("startDate", startDate);
params.put("endDate", endDate);
return recordMapper.selectByUserIdAndDateRange(params);
}
/**
* 生成分类统计报表
*/
public Map<String, Object> getCategoryStatistics(Integer userId, String month) {
// 执行分类统计逻辑
List<Map<String, Object>> result = recordMapper.selectCategoryStats(userId, month);
return processStatistics(result); // 数据处理和格式化
}
/**
* 统计结果后处理
*/
private Map<String, Object> processStatistics(List<Map<String, Object>> rawData) {
// 实现数据聚合、百分比计算等业务逻辑
return processedResult;
}
}
对应的MyBatis映射文件展示复杂查询能力:
<!-- 收支记录Mapper配置 -->
<mapper namespace="cn.zhku.jsj144.zk.financialManage.mapper.ShouzhiRecordMapper">
<select id="selectByUserIdAndDateRange" parameterType="map"
resultType="cn.zhku.jsj144.zk.financialManage.pojo.ShouzhiRecord">
SELECT sr.*, sc.parent_category, sc.son_category
FROM shouzhi_record sr
LEFT JOIN shouzhi_category sc ON sr.shouzhi_category_id = sc.szcid
WHERE sr.user_id = #{userId}
AND sr.szr_date BETWEEN #{startDate} AND #{endDate}
ORDER BY sr.szr_date DESC
</select>
<select id="selectCategoryStats" parameterType="map"
resultType="map">
SELECT
sc.parent_category as category,
SUM(sr.szr_num) as totalAmount,
COUNT(*) as recordCount
FROM shouzhi_record sr
JOIN shouzhi_category sc ON sr.shouzhi_category_id = sc.szcid
WHERE sr.user_id = #{userId}
AND sr.szr_date LIKE CONCAT(#{month}, '%')
GROUP BY sc.parent_category
</select>
</mapper>
架构优势体现:
- SQL优化:通过JOIN查询避免N+1问题,提升查询性能
- 结果映射:MyBatis自动将结果集映射为Java对象,减少样板代码
- 动态SQL:支持条件查询,适应不同的业务场景需求
总结与展望
本系统通过SSM框架的有机结合,实现了个人财务管理的核心需求。Spring的依赖注入和事务管理保证了系统的稳定性和可维护性,MyBatis的灵活SQL映射为复杂查询提供了强大支持,Spring MVC的清晰分层使得前后端协作更加高效。
未来扩展方向:
- 集成机器学习算法实现智能消费预测
- 增加多维度数据可视化分析
- 支持第三方支付平台数据自动导入
- 实现跨平台移动端应用
该系统不仅是一个完整的技术实现案例,更为SSM框架在实际项目中的应用提供了最佳实践参考。