尧图精选

JavaEE+SSH+Oracle健康管理系统实战指南

🕒 发布时间:2026/9/13 15:22:36 📁 来源:尧图网络
简介本资源是一套基于JavaEE平台、采用SSHStrutsSpringHibernate框架与Oracle数据库开发的健康管理系统完整项目面向计算机专业本科生及初学者适用于毕业设计、课程设计与Web开发实践。项目包含经实测可稳定运行的全部源码、详细设计文档及配套辅导视频覆盖用户管理、健康档案维护、体检数据录入与统计分析等核心功能模块帮助学习者掌握企业级Java Web应用的分层架构设计与数据库集成方法。压缩包为ZIP格式共143.63MB内含Java源文件、JSP页面、配置文件、SQL脚本及PDF/DOCX格式文档各类文件协同支撑开发、部署与理解全流程。目前已有854人学习下载资源结构清晰、注释完整附带环境配置说明与常见问题排错提示特别适合零基础入门SSH整合开发并完成高质量毕设课题。1. 为什么还在用 JavaEE SSH Oracle 做健康管理系统不是过时而是稳得有道理你可能在招聘网站上看到“要求熟悉 Spring Boot、微服务、云原生”的岗位描述转头却在高校课程设计、区县级卫健信息平台、基层医院 HIS 扩展模块里频繁撞见JavaEE Struts2 Spring2.5 Hibernate3 Oracle10g/11g这套组合——它没消失只是沉到了真实落地的毛细血管里。这套技术栈不是为炫技而存在Struts2 的 Action 链式拦截适合健康档案录入的多步骤表单校验Spring2.5 的 XML 配置虽冗长但让科室权限、角色菜单、数据脱敏规则全部可审计、可追溯Hibernate3 的.hbm.xml映射文件强制开发者直面 Oracle 表结构与字段约束比如VARCHAR2(18 CHAR)存身份证号、NUMBER(12,2)存医保结算金额规避了 ORM 自动生成 SQL 时对 Oracle 分区索引、物化视图、ROWNUM分页的误用。它适合三类人高校计算机专业做课程设计的学生文档规范、源码结构清晰、答辩易讲清分层逻辑中小医疗信息化公司维护存量系统的工程师Oracle 数据库已运行十年迁移成本远高于功能迭代以及需要快速交付、不追求高并发但强依赖事务一致性的社区健康随访系统。本文不鼓吹复古而是带你把这套“老树”扎进当下开发环境——用 VS Code 替代 MyEclipse用 Oracle 11.2.0.4 兼容 JDK8用本地 SSH 端口转发调试远程 Oracle 监听让老架构跑出新效率。2. 搭建可运行的 JavaEESSHOracle 开发环境从 VS Code 配置到 Oracle 监听验证2.1 VS Code 中配置 JavaEE 语言环境与 SSH 远程调试支持VS Code 默认不内置 JavaEE 容器支持需分三步补全安装扩展、配置 JDK、启用远程 SSH 调试通道。首先安装官方推荐组合Extension Pack for Java含 Language Support for Java、Debugger for Java、Test Runner for Java、Remote - SSH用于连接部署服务器、SQLTools连接 Oracle。注意若提示“此扩展在此工作区中被禁用因为其被定义为在远程扩展主机中运行”说明你已在 SSH 连接状态下打开项目需在远程服务器端重新安装SQLTools并重启 VS Code 窗口。JDK 配置必须严格匹配 Oracle 版本——Oracle 11g R2 官方认证 JDK 范围为 1.6–1.7但实测 JDK 1.8u202 可稳定运行避免使用 JDK 9因 Struts2 的xwork-core-2.3.32.jar内部反射调用sun.misc.Unsafe在 JDK 9 模块化后失效。在 VS Code 设置中添加java.configuration.runtimes: [ { name: JavaSE-1.8, path: /opt/jdk1.8.0_202 } ]提示/opt/jdk1.8.0_202是 Linux 下典型路径Windows 用户需指向C:\Program Files\Java\jdk1.8.0_202。路径错误会导致 Maven 编译报Unsupported major.minor version 52.0即 JDK8 字节码版本。2.2 Oracle 11.2.0.4 数据库安装与监听服务启动关键步骤Oracle 安装最常卡在监听服务无法启动根源常是/etc/hosts配置或listener.ora端口冲突。以 Ubuntu 20.04 为例先确保127.0.0.1 localhost与本机 hostname如ubuntu-server同行否则lsnrctl start会报TNS-12537: TNS:connection closed。安装完成后手动编辑$ORACLE_HOME/network/admin/listener.oraLISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL IPC)(KEY EXTPROC1521)) (ADDRESS (PROTOCOL TCP)(HOST ubuntu-server)(PORT 1521)(IP FIRST)) ) )关键点HOST必须填服务器 hostname非localhost或127.0.0.1且该 hostname 必须在/etc/hosts中解析到本机 IP。启动监听后用tnsping ORCL验证连通性——若返回OK (10 msec)说明网络层就绪若报TNS-03505: Failed to resolve name则检查tnsnames.ora中ORCL服务名是否指向正确HOST和PORT。健康管理系统典型建库语句如下-- 创建表空间避免 SYSTEM 表空间膨胀 CREATE TABLESPACE health_data DATAFILE /u01/app/oracle/oradata/ORCL/health_data01.dbf SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 2G; -- 创建用户并授权最小权限原则 CREATE USER health_app IDENTIFIED BY H3lth2024 DEFAULT TABLESPACE health_data TEMPORARY TABLESPACE temp; GRANT CONNECT, RESOURCE TO health_app; GRANT CREATE VIEW, CREATE SYNONYM TO health_app; -- 关键授予执行存储过程权限健康随访常需 PL/SQL 封装业务逻辑 GRANT EXECUTE ANY PROCEDURE TO health_app;2.3 Maven 项目结构初始化与 SSH 框架核心依赖锁定基于 JavaEE 规范项目必须分webappJSP/Servlet、src/main/java业务逻辑、src/main/resourcesSSH 配置三层。pom.xml中 SSH 依赖需严格对应版本兼容性Struts2.3.32 与 Spring2.5.6 共存时必须排除 Spring 自带的commons-logging改用log4j否则运行时报NoSuchMethodError: org.apache.commons.logging.LogFactory.getLog。关键依赖片段如下properties spring.version2.5.6/spring.version struts2.version2.3.32/struts2.version hibernate.version3.6.10.Final/hibernate.version oracle.jdbc.version11.2.0.4/oracle.jdbc.version /properties dependencies !-- Spring 核心排除 commons-logging -- dependency groupIdorg.springframework/groupId artifactIdspring-core/artifactId version${spring.version}/version exclusions exclusion groupIdcommons-logging/groupId artifactIdcommons-logging/artifactId /exclusion /exclusions /dependency !-- Oracle JDBC 驱动必须用 ojdbc6.jarojdbc8 不兼容 Hibernate3 -- dependency groupIdcom.oracle.database.jdbc/groupId artifactIdojdbc6/artifactId version${oracle.jdbc.version}/version /dependency !-- Hibernate 连接池用 C3P0比默认 DriverManager 更稳定 -- dependency groupIdc3p0/groupId artifactIdc3p0/artifactId version0.9.1.2/version /dependency /dependencies注意ojdbc6.jar必须手动下载并mvn install:install-file到本地仓库因 Oracle 官方未发布至 Maven Central。命令为mvn install:install-file -Dfileojdbc6.jar -DgroupIdcom.oracle.database.jdbc -DartifactIdojdbc6 -Dversion11.2.0.4 -Dpackagingjar3. 健康管理系统核心模块实现从患者档案录入到 Oracle 分页查询优化3.1 Struts2 Action 层处理多步骤健康档案录入健康档案录入需校验身份证号格式、血压值范围、过敏史关键词等Struts2 的ValidationAware接口配合 XML 验证文件可实现解耦。例如PatientAction-validation.xml!DOCTYPE validators PUBLIC -//Apache Struts//XWork Validator 1.0.3//EN http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd validators field nameidCard field-validator typeregex param nameexpression![CDATA[^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$]]/param message身份证号码格式不正确/message /field-validator /field field namesystolicPressure field-validator typeint param namemin50/param param namemax200/param message收缩压应在50-200mmHg之间/message /field-validator /field /validatorsAction 类继承ActionSupport重写validate()方法补充业务级校验如“孕妇建档需填写末次月经日期”public class PatientAction extends ActionSupport { private String idCard; private int systolicPressure; private Date lastMenstrualDate; private boolean isPregnant; Override public void validate() { if (isPregnant (lastMenstrualDate null)) { addFieldError(lastMenstrualDate, 孕妇必须填写末次月经日期); } } public String execute() throws Exception { // 调用 Service 层保存 patientService.savePatient(this); return SUCCESS; } }提示addFieldError()会自动将错误信息绑定到 JSP 表单的s:fielderror标签无需手动传参。3.2 Spring 管理 Hibernate SessionFactory 与 Oracle 特定配置applicationContext.xml中配置SessionFactory时必须显式指定 Oracle 方言和连接池参数否则分页、序列、LOB 处理会出错bean idsessionFactory classorg.springframework.orm.hibernate3.LocalSessionFactoryBean property namedataSource refdataSource/ property namehibernateProperties props !-- 强制使用 Oracle10g 方言兼容 11g -- prop keyhibernate.dialectorg.hibernate.dialect.Oracle10gDialect/prop !-- 启用二级缓存健康档案查询频次高 -- prop keyhibernate.cache.use_second_level_cachetrue/prop prop keyhibernate.cache.provider_classorg.hibernate.cache.EhCacheProvider/prop !-- Oracle 分页必须用 ROWNUM而非 LIMIT -- prop keyhibernate.jdbc.use_scrollable_resultsetfalse/prop !-- 关键解决身份证科学计数法问题见热词 -- prop keyhibernate.jdbc.use_get_generated_keysfalse/prop /props /property property namemappingResources list valuecom/health/pojo/Patient.hbm.xml/value /list /property /beanPatient.hbm.xml中身份证字段必须声明为string类型并关闭length截断class namecom.health.pojo.Patient tablePATIENT_INFO id nameid columnID generator classsequence param namesequenceSEQ_PATIENT_ID/param /generator /id !-- 关键身份证用 string 映射避免 Oracle NUMBER 类型导致科学计数 -- property nameidCard columnID_CARD typestring length18/ property namebloodType columnBLOOD_TYPE typestring length3/ /class3.3 Oracle 分页查询优化ROWNUM 与健康数据统计结合健康管理系统常需“按年龄段统计高血压患者数”直接GROUP BY在大数据量下极慢。应利用 Oracle 物化视图预计算-- 创建物化视图日志必须先建 CREATE MATERIALIZED VIEW LOG ON PATIENT_INFO WITH SEQUENCE, ROWID (ID_CARD, BLOOD_PRESSURE, BIRTHDAY) INCLUDING NEW VALUES; -- 每日刷新的物化视图统计各年龄段高血压人数 CREATE MATERIALIZED VIEW mv_hypertension_age BUILD IMMEDIATE REFRESH FAST ON DEMAND START WITH SYSDATE NEXT SYSDATE 1 AS SELECT FLOOR(MONTHS_BETWEEN(SYSDATE, BIRTHDAY)/12) AS age_group, COUNT(*) AS hypertensive_count FROM PATIENT_INFO WHERE BLOOD_PRESSURE 140 GROUP BY FLOOR(MONTHS_BETWEEN(SYSDATE, BIRTHDAY)/12);Java 层分页查询采用ROWNUM嵌套写法Hibernate3 不支持OFFSET/FETCH// HQL 无法生成正确 ROWNUM改用原生 SQL String sql SELECT * FROM ( SELECT a.*, ROWNUM rnum FROM ( SELECT ID, ID_CARD, NAME, SYSTOLIC_PRESSURE FROM PATIENT_INFO WHERE SYSTOLIC_PRESSURE ? ORDER BY CREATE_TIME DESC ) a WHERE ROWNUM ? ) WHERE rnum ?; Query query session.createSQLQuery(sql) .addEntity(Patient.class) .setParameter(0, 140) .setParameter(1, (pageNo * pageSize)) // 上限 .setParameter(2, ((pageNo - 1) * pageSize)); // 下限 ListPatient patients query.list();注意ROWNUM必须在ORDER BY后应用否则排序失效。参数pageNo从 1 开始pageSize20时第 2 页的rnum 20 AND rnum 40。4. 生产环境排错与性能加固解决 Oracle 监听异常、SSH 连接超时及健康数据脱敏4.1 Oracle 监听服务无法启动的三大根因与修复命令监听失败 80% 源于配置文件语法错误、端口占用、权限不足。按顺序执行以下诊断命令# 1. 检查 listener.ora 语法无输出即正确 $ORACLE_HOME/bin/lsnrctl status 21 | grep -i syntax error # 2. 查看 1521 端口是否被占用Ubuntu 常见于 snap 安装的 lxd sudo ss -tuln | grep :1521 # 若被占释放端口sudo kill -9 $(sudo lsof -t -i:1521) # 3. 检查 Oracle 用户对 $ORACLE_HOME/network/admin 的读写权限 ls -ld $ORACLE_HOME/network/admin # 修复权限sudo chown -R oracle:oinstall $ORACLE_HOME/network/admin # 4. 强制重载监听不中断现有连接 $ORACLE_HOME/bin/lsnrctl reload若仍失败检查$ORACLE_HOME/network/log/listener.log最后 20 行tail -20 $ORACLE_HOME/network/log/listener.log # 常见错误 TNS-01155: Incorrectly specified SID_LIST_LISTENER 对应 listener.ora 中 SID_LIST 缺失4.2 SSH 连接服务器时避免重复输密码密钥登录自动化配置健康管理系统部署服务器需频繁 SSH 登录如上传 WAR、查看日志手动输密码低效且不安全。在开发机生成密钥对并部署公钥# 1. 生成 RSA 密钥不设密码便于脚本调用 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_health -N # 2. 将公钥复制到目标服务器假设服务器 IP 10.0.0.47 ssh-copy-id -i ~/.ssh/id_rsa_health.pub oracle10.0.0.47 # 3. 配置别名简化登录写入 ~/.ssh/config Host health-db HostName 10.0.0.47 User oracle IdentityFile ~/.ssh/id_rsa_health Port 22之后只需ssh health-db即可免密登录。VS Code 的 Remote-SSH 扩展会自动读取此配置连接时选择health-db即可。4.3 健康数据敏感字段脱敏Oracle VPD虚拟私有数据库策略患者身份证号、手机号在报表导出时需脱敏如110101199003072135→110101******2135传统应用层处理易遗漏。Oracle VPD 可在数据库层强制拦截-- 1. 创建策略函数只对非管理员用户脱敏 CREATE OR REPLACE FUNCTION f_patient_mask ( p_schema VARCHAR2, p_object VARCHAR2 ) RETURN VARCHAR2 AS v_predicate VARCHAR2(2000); BEGIN IF SYS_CONTEXT(USERENV, SESSION_USER) ! HEALTH_APP THEN v_predicate : SUBSTR(ID_CARD, 1, 6) || ****** || SUBSTR(ID_CARD, -4) ID_CARD; ELSE v_predicate : 11; END IF; RETURN v_predicate; END; -- 2. 将策略绑定到 PATIENT_INFO 表 BEGIN DBMS_RLS.ADD_POLICY( object_schema HEALTH_APP, object_name PATIENT_INFO, policy_name patient_mask_policy, function_schema HEALTH_APP, policy_function f_patient_mask, statement_types SELECT ); END;提示VPD 策略仅对SELECT有效INSERT/UPDATE仍需应用层校验。测试时用SELECT ID_CARD FROM PATIENT_INFO WHERE ROWNUM1普通用户看到脱敏值HEALTH_APP用户看到明文。5. VS Code 远程开发实战调试 SSH 连接的 Oracle 数据库与健康业务逻辑5.1 VS Code 中配置 SQLTools 连接局域网 Oracle 数据库PL/SQL Developer 连接局域网 Oracle 需配置tnsnames.ora而 VS Code 的 SQLTools 插件支持直接填写连接参数更轻量。在 VS Code 命令面板CtrlShiftP输入SQLTools: New Connection填写Name:HealthDB-LocalDriver:OracleHost:10.0.0.47Oracle 服务器 IPPort:1521Database:ORCL服务名非 SIDUser:health_appPassword:H3lth2024Advanced:connectString10.0.0.47:1521/ORCL强制指定连接串连接成功后在 SQL 文件中右键Execute Query即可运行健康统计 SQL-- 查询近 30 天新增糖尿病患者利用 Oracle TRUNC 函数 SELECT COUNT(*) AS new_diabetes_count FROM PATIENT_INFO WHERE DIAGNOSIS 糖尿病 AND CREATE_TIME TRUNC(SYSDATE) - 30;注意TRUNC(SYSDATE)返回当天零点时间比SYSDATE-30更精确避免时区偏差。5.2 远程调试 Java Web 应用VS Code Attach 到 Tomcat 进程健康管理系统部署在远程 Tomcat需实时调试PatientAction执行流程。在远程服务器启动 Tomcat 时添加 JPDA 参数# 修改 $CATALINA_HOME/bin/catalina.sh # 在 JAVA_OPTS 行追加 JAVA_OPTS$JAVA_OPTS -agentlib:jdwptransportdt_socket,address8000,servery,suspendn然后在 VS Code 中创建.vscode/launch.json{ version: 0.2.0, configurations: [ { type: java, name: Attach to Remote Tomcat, request: attach, hostName: 10.0.0.47, port: 8000, projectName: health-system } ] }启动远程 Tomcat 后在 VS Code 中按F5选择Attach to Remote Tomcat即可在PatientAction.execute()方法打断点观察idCard、systolicPressure等参数值——这比日志排查快 10 倍。5.3 健康数据导出防错解决身份证科学计数法与 Excel 兼容性Oracle 查询结果导出到 Excel 时身份证号常显示为1.10101E17科学计数法因 Excel 将长数字自动转浮点。根本解法在 Java 层导出时设置单元格格式// 使用 Apache POI 导出 XSSFWorkbook workbook new XSSFWorkbook(); XSSFSheet sheet workbook.createSheet(患者档案); XSSFRow headerRow sheet.createRow(0); headerRow.createCell(0).setCellValue(身份证号); headerRow.createCell(1).setCellValue(姓名); // 关键为身份证列设置文本格式避免 Excel 自动转换 XSSFCellStyle idCardStyle workbook.createCellStyle(); idCardStyle.setDataFormat(workbook.createDataFormat().getFormat()); XSSFRow dataRow sheet.createRow(1); dataRow.createCell(0).setCellStyle(idCardStyle); dataRow.getCell(0).setCellValue(patient.getIdCard()); // 直接 setCellValue(String) dataRow.createCell(1).setCellValue(patient.getName()); // 输出文件 try (FileOutputStream fileOut new FileOutputStream(health_export.xlsx)) { workbook.write(fileOut); }提示格式符强制 Excel 将单元格视为文本setCellValue(String)确保字符串不被转数字。若用 CSV 导出则在身份证字段前后加双引号\idCard\.本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →