ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

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

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/ReactMyBatis 封装 SQL非纯 JDBC 手写Spring 管理事务与 Bean 生命周期非硬编码 new 对象MySQL 存储参保人基本信息、缴费明细、个人账户累计额等结构化数据——整套技术栈锁定在 Java Web 开发的成熟稳态区不追新、不炫技但能跑通从用户登录 → 单位参保申报 → 社保经办审核 → 个人账户余额展示的完整链路。它适合两类人一是需要快速验证社保业务逻辑的基层信息化人员二是正在准备毕业设计、需提交“可本地部署数据库可导入页面可交互”三要素的计算机专业学生。注意它不依赖云服务、不调用外部 API、不包含加密模块所有功能均基于 Tomcat 本地容器 MySQL 单机实例完成闭环。1.1 为什么是 SSM 而不是 Spring BootSSMSpring 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.xml、application.properties如何覆盖spring-mvc.xml中的视图解析器配置——这些偏离社保业务本身的技术绕行对初学者是负担。1.2 JSP 在 2024 年为何仍被用于社保系统原型JSP 的存在不是技术怀旧而是特定场景下的效率权衡。该系统中JSP 主要承担三类不可替代的任务第一动态生成符合《社会保险业务档案管理规范》的 PDF 报表预览页通过jsp:include引入公共页眉页脚再用 JSTLc: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-configel-ignoredfalse/el-ignored/jsp-config是否启用 EL 表达式——这是新手常卡住的第一步。1.3 MySQL 数据库设计直指社保业务实体关系该系统的mysql目录下提供.sql文件其建表语句不是泛泛的user、order而是紧扣社保领域建模employee表含id_card_no唯一索引触发身份证号 18 位校验、insured_statusENUM(正常参保,暂停缴费,终止关系)insurance_record表含record_id主键、emp_id外键、ins_typeTINYINT1养老,2医疗,3失业、base_amountDECIMAL(12,2)缴费基数、personal_ratioDECIMAL(5,4)个人缴费比例最关键的是account_balance表存储emp_id、balance_dateDATE 类型按月快照、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.version1.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.HttpServletRequest的getParts()方法以处理文件上传而 Tomcat 9 是最后一个完全兼容 Servlet 3.1对应 JSP 2.3且默认启用 APR 连接器的稳定版本JDK 8 的java.time.LocalDate尚未引入系统中日期字段如entry_date仍用java.util.Date若强行升级至 JDK 17SimpleDateFormat解析2023-06-15时会抛出DateTimeParseException因新版本默认关闭 Legacy Date-Time API 兼容。安装步骤如下下载 Adoptium JDK 8u362 非 Oracle 官方免账号下载设置JAVA_HOME为C:\Program Files\Eclipse Adoptium\jdk-8.0.362.8-hotspotWindows或/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/HomemacOS下载 Apache Tomcat 9.0.83 Core tar.gz 或 zip解压后修改conf/server.xml将Connector port8080改为Connector port8081避免与本地其他服务冲突启动bin/startup.batWindows或bin/startup.shmacOS/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。安装步骤下载 MySQL 5.7.44 非 8.0因系统中GROUP_CONCAT用法与 8.0 不兼容安装时选择 “Server Only”设置 root 密码为root便于后续脚本连接安装完成后编辑my.iniWindows或my.cnfmacOS/Linux在[mysqld]段添加character-set-server utf8mb4 collation-server utf8mb4_unicode_ci init_connectSET NAMES utf8mb4 skip-character-set-client-handshake true重启 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 中选择File → Open定位到解压根目录IDEA 会自动识别为 Maven 项目因存在pom.xml等待 Maven 依赖下载完成约 3 分钟重点确认spring-webmvc-5.2.22.RELEASE.jar、mybatis-3.4.6.jar、mysql-connector-java-5.1.47.jar已加载右键项目名 →Open Module Settings→Project选项卡将Project SDK设为 JDK 1.8Project language level设为8 - Lambdas, type annotations etc.进入Artifacts选项卡点击→Web Application: Archive→For social-insurance生成social-insurance:war exploded在Output Layout标签页展开Available Elements将WebContent/拖入WEB-INF同级目录确保WEB-INF/web.xml和WEB-INF/lib/存在最后点击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测试用参保人数据。必须严格按此顺序执行否则外键约束会失败首先执行social_insurance.sql创建数据库、用户表sys_user、参保单位表ins_unit、参保人员表employee等 12 张表并建立employee.unit_id → ins_unit.id、insurance_record.emp_id → employee.id等外键再执行init_data.sql插入系统管理员账号usernameadmin,passworde10adc3949ba59abbe56e057f20f883eMD5 加密、默认参保类型养老、医疗、失业、缴费比例配置如养老个人 8%单位 16%最后执行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): Cant create table social_insurance.insurance_record (errno: 150 Foreign key constraint is incorrectly formed)说明employee表未创建成功请检查social_insurance.sql中employee表的ENGINEInnoDB是否遗漏MyISAM 不支持外键。3.2 修改 JDBC 连接配置的三个必改参数src/main/resources/jdbc.properties是数据库连接中枢需根据本地环境修改以下三项参数原值必改值说明jdbc.urljdbc:mysql://localhost:3306/social_insurance?useUnicodetruecharacterEncodingutf8jdbc:mysql://localhost:3306/social_insurance?useUnicodetruecharacterEncodingutf8mb4serverTimezoneAsia/Shanghai添加serverTimezoneAsia/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中缺失artifactIdcommons-codec/artifactId则login请求会返回 500 错误java.lang.NoClassDefFoundError: org/apache/commons/codec/digest/DigestUtils。此时需在pom.xml的dependencies中补充dependency groupIdcommons-codec/groupId artifactIdcommons-codec/artifactId version1.11/version /dependency重新mvn clean compile后即可解决。4. 核心业务功能验证参保登记、缴费核定与账户查询三步实操4.1 单位参保登记从新增单位到关联参保人登录系统后点击左侧菜单“单位管理” → “新增单位”填写单位名称如“XX市第一人民医院”、统一社会信用代码18 位数字字母组合、单位类型事业/企业/机关、联系人及电话。提交后系统执行InsUnitService.save(unit)调用ins_unit表的INSERT语句返回单位 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_type1和ins_type2体现“一人多险”业务特性。4.2 缴费核定按月生成缴费清单并触发账户累加点击“缴费管理” → “缴费核定”选择单位、起止年月如2023-06至2023-06点击“生成清单”。后台执行查询该单位下所有正常参保人员WHERE e.insured_status 正常参保根据ins_unit.base_salary单位基准工资和employee.salary_level个人工资等级计算base_amount base_salary * salary_level_coefficient按ins_type查找ins_config表中的personal_ratio和unit_ratio计算个人缴费额base_amount * personal_ratio和单位缴费额base_amount * unit_ratio将结果插入insurance_record表并调用AccountBalanceService.updateBalance(empId, currentMonth)更新account_balance表中当月快照。此过程涉及事务控制若第 4 步更新账户失败整个核定操作应全部回滚。查看InsuranceRecordService.java其方法标注Transactional且applicationContext.xml中已配置tx:annotation-driven transaction-managertransactionManager/确保 ACID。4.3 个人账户查询多维度筛选与导出 PDF在首页顶部搜索框输入身份证号110101199003072817点击“查询”页面展示基本信息姓名、性别、出生日期、参保状态近 12 个月账户变动表格列出balance_date、personal_accumulated、unit_accumulated、total_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.xml中spring-webmvc依赖范围错误。检查pom.xmldependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version5.2.22.RELEASE/version !-- 错误写法scopeprovided -- !-- scopeprovided/scope -- /dependency若存在scopeprovided/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 仍可能出现乱码需同步检查三层JSP 页面头login.jsp第一行必须为% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%web.xml 编码过滤器src/main/webapp/WEB-INF/web.xml中需存在filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mappingTomcat conf/web.xml 全局设置打开conf/web.xml找到servlet标签内的defaultservlet添加init-param param-nameuseBodyEncodingForURI/param-name param-valuetrue/param-value /init-param三者缺一不可否则 GET 请求如?name张三中文参数仍会乱码。5.3 MySQL 连接池最大活跃连接数的合理设定jdbc.properties中jdbc.maxActive50是危险值。社保系统并发量低单点部署日活 100但maxActive50会导致 MySQL 服务端连接数耗尽MySQL 默认max_connections151引发Too many connections错误。应改为jdbc.maxActive10 jdbc.minIdle2 jdbc.maxWait60000理由10 个连接足以支撑 50 人并发连接复用率高minIdle2保证空闲时至少 2 个连接常驻避免频繁创建销毁开销maxWait6000060 秒防止请求无限等待。修改后在 MySQL 中执行SHOW STATUS LIKE Threads_connected;正常值应在 2~10 之间波动。提示若需监控连接池状态可在applicationContext.xml中添加 Druid 数据源的监控 Servletservlet servlet-nameDruidStatView/servlet-name servlet-classcom.alibaba.druid.support.http.StatViewServlet/servlet-class /servlet servlet-mapping servlet-nameDruidStatView/servlet-name url-pattern/druid/*/url-pattern /servlet-mapping访问http://localhost:8081/druid/login.html默认账号admin/admin即可查看实时连接数、SQL 执行耗时等指标。本文还有配套的精品资源点击获取
返回列表