news 2026/9/13 16:22:28

SSM+JSP+MySQL社保系统实战:参保登记与账户查询全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SSM+JSP+MySQL社保系统实战:参保登记与账户查询全流程

简介:这是一套基于SSM框架与JSP技术实现的、可直接运行的社会保险管理系统源码,适用于计算机专业本科生课程设计与毕业设计实践。系统覆盖参保档案管理、保险缴纳审核、社保金发放、多维信息查询、补缴信息发布及后台系统维护六大核心模块,完整模拟企事业单位社保业务全流程,具备较强的教学示范性与工程参考价值。资源为24.47MB的ZIP压缩包,包含可运行的Java Web源码、MySQL数据库脚本及配套说明文档,其中源码以Controller-Service-DAO分层结构组织,JSP页面侧重业务表单与数据展示,SQL文件支持一键建库建表。目前已有1802人学习下载,读者可快速部署运行、理解SSM整合要点、掌握JDBC事务处理与前后端交互逻辑,并参考其模块化设计思路用于同类政务类管理系统开发。

1. 这不是又一个“学生管理系统”:用 SSM + JSP + MySQL 搭建真实可运行的社会保险业务系统

你点开这个压缩包,看到的不是“学生成绩录入”或“图书借阅统计”,而是一套覆盖参保登记、缴费核定、待遇计算、账户查询四类核心业务的社保管理原型。它用 JSP 做前端页面渲染(非 Vue/React),MyBatis 封装 SQL(非纯 JDBC 手写),Spring 管理事务与 Bean 生命周期(非硬编码 new 对象),MySQL 存储参保人基本信息、缴费明细、个人账户累计额等结构化数据——整套技术栈锁定在 Java Web 开发的成熟稳态区,不追新、不炫技,但能跑通从用户登录 → 单位参保申报 → 社保经办审核 → 个人账户余额展示的完整链路。它适合两类人:一是需要快速验证社保业务逻辑的基层信息化人员,二是正在准备毕业设计、需提交“可本地部署+数据库可导入+页面可交互”三要素的计算机专业学生。注意:它不依赖云服务、不调用外部 API、不包含加密模块,所有功能均基于 Tomcat 本地容器 + MySQL 单机实例完成闭环。

1.1 为什么是 SSM 而不是 Spring Boot?

SSM(Spring + Spring MVC + MyBatis)在此类系统中并非“过时选择”,而是业务约束下的理性决策。首先,社保业务规则复杂度高(如“中断缴费超 3 个月,个人账户计息暂停”“跨省转移接续需校验两地缴费年限”),需要开发者对事务边界、SQL 执行时机、HTTP 请求生命周期有显式控制权;Spring Boot 的自动配置虽快,但一旦出现“MyBatis 查询返回空列表但日志无报错”“Spring MVC 参数绑定失败却跳转到错误页而非返回 JSON”等问题,排查路径更长。其次,该系统需与部分老旧政务内网环境兼容(如仅开放 8080 端口、禁用 HTTPS、要求 WAR 包部署),SSM 项目天然以webapp/目录结构组织静态资源与 JSP,打包为 WAR 后可直接丢进 Tomcatwebapps/目录,无需额外配置嵌入式容器。最后,教学场景下,SSM 的三层分层(Controller 层接收请求、Service 层封装业务、DAO 层操作数据库)让代码职责清晰,学生能直观看到“一个参保登记请求如何从 JSP 表单 → Controller 解析 → Service 校验身份证号合法性 → DAO 插入 employee 和 insurance_record 两张表”的完整链条。若强行改用 Spring Boot,反而需额外解释@SpringBootApplication如何替代web.xmlapplication.properties如何覆盖spring-mvc.xml中的视图解析器配置——这些偏离社保业务本身的技术绕行,对初学者是负担。

1.2 JSP 在 2024 年为何仍被用于社保系统原型?

JSP 的存在不是技术怀旧,而是特定场景下的效率权衡。该系统中,JSP 主要承担三类不可替代的任务:第一,动态生成符合《社会保险业务档案管理规范》的 PDF 报表预览页(通过<jsp:include>引入公共页眉页脚,再用 JSTL<c:forEach>遍历缴费记录列表,最终由 iText 导出);第二,实现参保单位经办人与社保局审核员的双角色页面隔离——同一insurance_list.jsp中,通过<c:if test="${sessionScope.user.role == 'admin'}">控制“审核通过”按钮是否显示,避免前后端重复鉴权逻辑;第三,处理浏览器端轻量级交互,如“选择参保类型(养老/医疗/失业)后,自动刷新下方缴费基数下拉框”。这些需求若用纯 HTML + AJAX,需额外维护 JS 文件、定义 API 接口、处理跨域(即使本地也需配置代理),而 JSP 在服务端完成数据组装与模板渲染,一次 HTTP 请求即返回完整 HTML,对网络带宽受限的基层社保所环境更友好。当然,其代价是 JSP 编译后的.java文件位于Tomcat/work/Catalina/localhost/yourapp/org/apache/jsp/目录,调试时需关注web.xml<jsp-config><el-ignored>false</el-ignored></jsp-config>是否启用 EL 表达式——这是新手常卡住的第一步。

1.3 MySQL 数据库设计直指社保业务实体关系

该系统的mysql目录下提供.sql文件,其建表语句不是泛泛的userorder,而是紧扣社保领域建模:employee表含id_card_no(唯一索引,触发身份证号 18 位校验)、insured_status(ENUM('正常参保','暂停缴费','终止关系'));insurance_record表含record_id(主键)、emp_id(外键)、ins_type(TINYINT,1=养老,2=医疗,3=失业)、base_amount(DECIMAL(12,2),缴费基数)、personal_ratio(DECIMAL(5,4),个人缴费比例);最关键的是account_balance表,存储emp_idbalance_date(DATE 类型,按月快照)、personal_accumulated(个人账户累计额)、unit_accumulated(单位划入累计额),并设置联合索引(emp_id, balance_date)支持“查询某人近 12 个月账户变动”高频查询。这种设计规避了常见误区:不把所有字段塞进一张大宽表(如把缴费记录和账户余额混存),也不用 JSON 字段存储缴费明细(丧失 SQL 聚合能力)。导入时需注意 MySQL 版本兼容性——若使用 8.0+,需确认sql_mode未启用STRICT_TRANS_TABLES,否则INSERT INTO employee (name, id_card_no) VALUES ('张三', '')会因空字符串插入失败(而社保系统允许暂缺身份证号,标记为“待补录”)。

2. 本地环境搭建:从 JDK 到 Tomcat 的最小可行路径

2.1 JDK 8 与 Tomcat 9 的版本锁定逻辑

该系统源码中pom.xml明确声明<java.version>1.8</java.version>,且web.xml头部为<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",这决定了必须使用 JDK 8 和 Tomcat 9(非 10+)。原因在于:JSP 2.3 规范要求 Servlet 容器支持javax.servlet.http.HttpServletRequestgetParts()方法以处理文件上传,而 Tomcat 9 是最后一个完全兼容 Servlet 3.1(对应 JSP 2.3)且默认启用 APR 连接器的稳定版本;JDK 8 的java.time.LocalDate尚未引入,系统中日期字段(如entry_date)仍用java.util.Date,若强行升级至 JDK 17,SimpleDateFormat解析"2023-06-15"时会抛出DateTimeParseException(因新版本默认关闭 Legacy Date-Time API 兼容)。安装步骤如下:

  1. 下载 Adoptium JDK 8u362 (非 Oracle 官方,免账号下载);
  2. 设置JAVA_HOMEC:\Program Files\Eclipse Adoptium\jdk-8.0.362.8-hotspot(Windows)或/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home(macOS);
  3. 下载 Apache Tomcat 9.0.83 (Core tar.gz 或 zip);
  4. 解压后修改conf/server.xml,将<Connector port="8080"改为<Connector port="8081"(避免与本地其他服务冲突);
  5. 启动bin/startup.bat(Windows)或bin/startup.sh(macOS/Linux),访问http://localhost:8081出现 Tomcat 欢迎页即成功。

提示:若启动报错java.lang.UnsupportedClassVersionError: org/apache/jasper/servlet/JspServlet has been compiled by a more recent version of the Java Runtime,说明 JDK 版本高于编译要求,请检查JAVA_HOME是否指向 JDK 8。

2.2 MySQL 5.7 安装与字符集强制配置

该系统 SQL 文件中大量使用中文注释(如-- 创建参保人员表)及中文字段名(如姓名身份证号),必须确保 MySQL 使用utf8mb4字符集,否则导入时出现乱码或报错Incorrect string value: '\xE4\xBD\xA0\xE5\xA5\xBD' for column 'name'。安装步骤:

  1. 下载 MySQL 5.7.44 (非 8.0,因系统中GROUP_CONCAT用法与 8.0 不兼容);
  2. 安装时选择 “Server Only”,设置 root 密码为root(便于后续脚本连接);
  3. 安装完成后,编辑my.ini(Windows)或my.cnf(macOS/Linux),在[mysqld]段添加:
character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' skip-character-set-client-handshake = true
  1. 重启 MySQL 服务,执行mysql -u root -p登录后,运行:
SHOW VARIABLES LIKE 'character_set%'; -- 确认 character_set_server 和 collation_server 均为 utf8mb4 CREATE DATABASE social_insurance DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;

此步骤不可跳过——若仅在建库时指定CHARSET,但init_connect未设置,JDBC 连接时仍可能因客户端字符集不一致导致中文插入失败。

2.3 源码导入 IDEA 并配置 Artifact 的关键操作

解压214ssm-mysql-jsp 社会保险管理系统.zip后,得到src/WebContent/database/三个目录。在 IntelliJ IDEA 中:

  1. 选择File → Open,定位到解压根目录,IDEA 会自动识别为 Maven 项目(因存在pom.xml);
  2. 等待 Maven 依赖下载完成(约 3 分钟),重点确认spring-webmvc-5.2.22.RELEASE.jarmybatis-3.4.6.jarmysql-connector-java-5.1.47.jar已加载;
  3. 右键项目名 →Open Module SettingsProject选项卡,将Project SDK设为 JDK 1.8,Project language level设为8 - Lambdas, type annotations etc.
  4. 进入Artifacts选项卡,点击+Web Application: ArchiveFor 'social-insurance',生成social-insurance:war exploded
  5. Output Layout标签页,展开Available Elements,将WebContent/拖入WEB-INF同级目录(确保WEB-INF/web.xmlWEB-INF/lib/存在);
  6. 最后点击Apply。此时target/social-insurance-1.0-SNAPSHOT.war即为可部署包,但开发阶段推荐使用exploded模式,便于实时修改 JSP 后刷新生效。

注意:若 IDEA 提示Cannot resolve symbol 'springframework',请检查pom.xml<dependency>groupId是否为org.springframework(非org.springframe等拼写错误),并点击右上角Reload project图标。

3. 数据库初始化与系统首启:从 SQL 导入到登录验证

3.1 执行 database 目录下 SQL 文件的顺序与依赖关系

database/目录包含social_insurance.sql(建库建表)、init_data.sql(初始化基础数据)、test_data.sql(测试用参保人数据)。必须严格按此顺序执行,否则外键约束会失败:

  1. 首先执行social_insurance.sql:创建数据库、用户表(sys_user)、参保单位表(ins_unit)、参保人员表(employee)等 12 张表,并建立employee.unit_id → ins_unit.idinsurance_record.emp_id → employee.id等外键;
  2. 再执行init_data.sql:插入系统管理员账号(username='admin',password='e10adc3949ba59abbe56e057f20f883e',MD5 加密)、默认参保类型(养老、医疗、失业)、缴费比例配置(如养老个人 8%,单位 16%);
  3. 最后执行test_data.sql:插入 3 条测试参保人数据(张三李四王五),及其近 6 个月缴费记录和账户余额快照。

执行命令(在 MySQL 命令行中):

mysql -u root -proot social_insurance < database/social_insurance.sql mysql -u root -proot social_insurance < database/init_data.sql mysql -u root -proot social_insurance < database/test_data.sql

若提示ERROR 1005 (HY000): Can't create table 'social_insurance.insurance_record' (errno: 150 "Foreign key constraint is incorrectly formed"),说明employee表未创建成功,请检查social_insurance.sqlemployee表的ENGINE=InnoDB是否遗漏(MyISAM 不支持外键)。

3.2 修改 JDBC 连接配置的三个必改参数

src/main/resources/jdbc.properties是数据库连接中枢,需根据本地环境修改以下三项:

参数原值必改值说明
jdbc.urljdbc:mysql://localhost:3306/social_insurance?useUnicode=true&characterEncoding=utf8jdbc:mysql://localhost:3306/social_insurance?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai添加serverTimezone=Asia/Shanghai避免时间字段(如create_time)存入 MySQL 后比实际晚 14 小时
jdbc.usernamerootroot若 MySQL 修改了 root 密码,此处同步更新
jdbc.passwordrootroot同上

提示:若修改后启动报错The server time zone value 'XXX' is unrecognized,证明serverTimezone未生效,请检查 URL 中是否有多余空格或中文符号。

3.3 首次访问系统时的登录流程与密码解密逻辑

系统首页为login.jsp,输入账号admin、密码123456即可登录(init_data.sql中密码为明文123456的 MD5 值e10adc3949ba59abbe56e057f20f883e)。登录逻辑在com.controller.LoginController.java中:

@RequestMapping(value = "/login", method = RequestMethod.POST) public String login(@RequestParam String username, @RequestParam String password, Model model, HttpSession session) { String md5Password = DigestUtils.md5Hex(password); // 使用 commons-codec 生成 MD5 SysUser user = userService.findByUsernameAndPassword(username, md5Password); if (user != null) { session.setAttribute("user", user); // 存入 session return "redirect:/index.jsp"; // 跳转首页 } else { model.addAttribute("error", "用户名或密码错误"); return "login"; } }

关键点在于DigestUtils.md5Hex()调用——该方法来自commons-codec依赖,若pom.xml中缺失<artifactId>commons-codec</artifactId>,则login请求会返回 500 错误(java.lang.NoClassDefFoundError: org/apache/commons/codec/digest/DigestUtils)。此时需在pom.xml<dependencies>中补充:

<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency>

重新mvn clean compile后即可解决。

4. 核心业务功能验证:参保登记、缴费核定与账户查询三步实操

4.1 单位参保登记:从新增单位到关联参保人

登录系统后,点击左侧菜单“单位管理” → “新增单位”,填写单位名称(如“XX市第一人民医院”)、统一社会信用代码(18 位数字字母组合)、单位类型(事业/企业/机关)、联系人及电话。提交后,系统执行:

  1. InsUnitService.save(unit)调用ins_unit表的INSERT语句;
  2. 返回单位 ID(自增主键),用于后续参保人登记。

接着进入“人员管理” → “新增参保人”,关键字段包括:

  • 身份证号:输入110101199003072817,后端EmployeeService.checkIdCard(idCardNo)会调用正则^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$校验格式,并通过 Luhn 算法验证末位校验码;
  • 所属单位:下拉框数据来自InsUnitService.findAll(),SQL 为SELECT id, unit_name FROM ins_unit ORDER BY unit_name
  • 参保类型:多选框,值为1,2(养老+医疗),对应insurance_record.ins_type字段。

提交后,系统同时向employee表插入人员信息,并向insurance_record表插入两条记录(ins_type=1ins_type=2),体现“一人多险”业务特性。

4.2 缴费核定:按月生成缴费清单并触发账户累加

点击“缴费管理” → “缴费核定”,选择单位、起止年月(如2023-062023-06),点击“生成清单”。后台执行:

  1. 查询该单位下所有正常参保人员(WHERE e.insured_status = '正常参保');
  2. 根据ins_unit.base_salary(单位基准工资)和employee.salary_level(个人工资等级),计算base_amount = base_salary * salary_level_coefficient
  3. ins_type查找ins_config表中的personal_ratiounit_ratio,计算个人缴费额base_amount * personal_ratio和单位缴费额base_amount * unit_ratio
  4. 将结果插入insurance_record表,并调用AccountBalanceService.updateBalance(empId, currentMonth)更新account_balance表中当月快照。

此过程涉及事务控制:若第 4 步更新账户失败,整个核定操作应全部回滚。查看InsuranceRecordService.java,其方法标注@Transactional,且applicationContext.xml中已配置<tx:annotation-driven transaction-manager="transactionManager"/>,确保 ACID。

4.3 个人账户查询:多维度筛选与导出 PDF

在首页顶部搜索框输入身份证号110101199003072817,点击“查询”,页面展示:

  • 基本信息:姓名、性别、出生日期、参保状态;
  • 近 12 个月账户变动:表格列出balance_datepersonal_accumulatedunit_accumulatedtotal_balance(二者之和);
  • 图表:使用Chart.js渲染折线图,X 轴为月份,Y 轴为total_balance

点击“导出 PDF”,触发AccountBalanceController.exportPdf()

Document document = new Document(PageSize.A4); PdfWriter.getInstance(document, new FileOutputStream("account_"+idCardNo+".pdf")); document.open(); Paragraph title = new Paragraph("个人账户明细报表", fontTitle); document.add(title); // 遍历 accountBalanceList,用 PdfPTable 添加表格行 document.close();

生成的 PDF 保存在 Tomcatbin/目录下,文件名含身份证号,符合社保档案管理要求。

5. 常见启动失败排错与三个关键参数调优

5.1 启动报错 “java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet” 的根因与修复

此错误表明 Spring MVC 核心类未加载,90% 源于pom.xmlspring-webmvc依赖范围错误。检查pom.xml

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.22.RELEASE</version> <!-- 错误写法:scope=provided --> <!-- <scope>provided</scope> --> </dependency>

若存在<scope>provided</scope>,需删除该行。因为provided表示“由容器(Tomcat)提供”,但 Tomcat 本身不包含 Spring 类,必须将spring-webmvc.jar打包进WEB-INF/lib/。修复后,重新mvn clean package,确认target/social-insurance-1.0-SNAPSHOT/WEB-INF/lib/spring-webmvc-5.2.22.RELEASE.jar存在。

5.2 JSP 页面中文乱码的三层过滤方案

即使 MySQL 字符集正确,JSP 仍可能出现乱码,需同步检查三层:

  1. JSP 页面头login.jsp第一行必须为<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. web.xml 编码过滤器src/main/webapp/WEB-INF/web.xml中需存在:
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
  1. Tomcat conf/web.xml 全局设置:打开conf/web.xml,找到<servlet>标签内的defaultservlet,添加:
<init-param> <param-name>useBodyEncodingForURI</param-name> <param-value>true</param-value> </init-param>

三者缺一不可,否则 GET 请求(如?name=张三)中文参数仍会乱码。

5.3 MySQL 连接池最大活跃连接数的合理设定

jdbc.propertiesjdbc.maxActive=50是危险值。社保系统并发量低(单点部署,日活 < 100),但maxActive=50会导致 MySQL 服务端连接数耗尽(MySQL 默认max_connections=151),引发Too many connections错误。应改为:

jdbc.maxActive=10 jdbc.minIdle=2 jdbc.maxWait=60000

理由:10 个连接足以支撑 50 人并发(连接复用率高),minIdle=2保证空闲时至少 2 个连接常驻,避免频繁创建销毁开销;maxWait=60000(60 秒)防止请求无限等待。修改后,在 MySQL 中执行SHOW STATUS LIKE 'Threads_connected';,正常值应在 2~10 之间波动。

提示:若需监控连接池状态,可在applicationContext.xml中添加 Druid 数据源的监控 Servlet:

<servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping>

访问http://localhost:8081/druid/login.html(默认账号admin/admin)即可查看实时连接数、SQL 执行耗时等指标。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 16:21:15

AI Agent跨会话记忆系统实战:从持久化到人格化交互

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 16:21:08

易语言调用Python3全攻略:管道、HTTP与嵌入式方案详解

简介&#xff1a;面向易语言开发者&#xff0c;这份压缩包提供了一套易语言与Python3无缝调用的完整方案&#xff0c;适合需要在现有易语言项目中嵌入爬虫、数据处理或AI功能的场景。包内包含易语言扩展模块与示例工程&#xff0c;配合Python服务端脚本和依赖库&#xff0c;实现…

作者头像 李华
网站建设 2026/9/13 16:19:17

SpringBoot+Vue构建农产品直卖平台技术解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 16:18:12

Starr收购IQUW:保险科技全球化战略解析

1. 收购事件概述2023年11月10日&#xff0c;全球领先的保险科技公司Starr正式宣布完成对英国专业保险集团IQUW Group的战略收购。这笔交易金额未公开的收购案&#xff0c;标志着Starr在国际保险市场扩张战略中迈出关键一步。作为交易的一部分&#xff0c;IQUW Group将保持独立运…

作者头像 李华
网站建设 2026/9/13 16:17:38

DNA存储技术:Python实现数据到生物分子的编码转换

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 16:17:32

MATLAB QAM调制解调GUI设计:从原理到硬件验证

简介&#xff1a;本资源是一套基于MATLAB实现的QAM调制与解调全过程仿真实验GUI系统&#xff0c;面向通信工程、电子信息类专业本科生及入门级仿真学习者&#xff0c;有效解决数字调制原理理解难、代码实现门槛高、可视化交互缺失等实践痛点。压缩包共11个文件&#xff0c;含7个…

作者头像 李华