239
社区成员




这个作业属于哪个课程 | FZU_SE_teacherW_4社区 |
---|---|
这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
这个作业的目标 | 个人技术总结 |
其他参考文献 | Spring Data JPA 官方文档、MySQL 官方文档 |
在团队开发中,我主要负责健康报告管理系统的后端服务设计与实现。整个项目基于 Spring Boot 构建,其中一项关键技术是基于 Spring Data JPA 的动态查询与数据持久化。
Spring Data JPA 提供了高效、简洁的数据库操作方式,尤其适合处理复杂数据查询与事务管理。它通过定义接口自动实现常见的数据库操作,能够大幅减少样板代码的编写。
选择学习 Spring Data JPA 的原因在于:
在健康报告管理模块中,需要实现查询某个用户最新的健康报告功能。这通过 Spring Data JPA 的自定义查询完成。
健康报告表 (health_report
) 结构如下:
字段名 | 类型 | 描述 |
---|---|---|
report_id | VARCHAR(32) | 健康报告 ID |
user_id | VARCHAR(32) | 用户 ID |
report_type | VARCHAR(50) | 报告类型 |
report_date | DATE | 报告生成日期 |
content | TEXT | 报告内容 |
suggestions | TEXT | 建议 |
created_at | TIMESTAMP | 创建时间 |
updated_at | TIMESTAMP | 更新时间 |
在 HealthReportRepository.java
中定义自定义查询方法:
@Repository
public interface HealthReportRepository extends JpaRepository<HealthReport, String> {
// 查找某个用户的最新健康报告
Optional<HealthReport> findTopByUserIdOrderByReportDateDesc(String userId);
}
findTopByUserIdOrderByReportDateDesc
:根据 userId
查找最新的健康报告(按 report_date
降序)。Optional
用于防止返回值为空时导致的空指针异常。通过 HealthReportRepository
调用查询方法:
@Service
public class HealthReportService {
@Autowired
private HealthReportRepository healthReportRepository;
public HealthReport getLatestReportByUserId(String userId) {
// 使用 findTopByUserIdOrderByReportDateDesc 查询最新报告
Optional<HealthReport> report = healthReportRepository.findTopByUserIdOrderByReportDateDesc(userId);
return report.orElse(null); // 如果没有报告,返回 null
}
}
在 HealthReportController
中,暴露 RESTful 接口:
@RestController
public class HealthReportController {
@Autowired
private HealthReportService healthReportService;
@GetMapping("/healthReportDetail")
public String getHealthReportDetail(@RequestParam("userId") String userId, Model model) {
HealthReport report = healthReportService.getLatestReportByUserId(userId);
if (report != null) {
model.addAttribute("report", report);
} else {
model.addAttribute("error", "没有找到健康报告");
}
return "healthReportDetail"; // 返回视图 healthReportDetail.html
}
}
为了自动生成健康报告,我们从健康数据表 (health_data
) 中获取用户的最新健康数据。
在 HealthData
实体中定义静态方法,通过原生 SQL 查询健康数据:
public static HealthData getLatestHealthData(String userId) {
HealthData healthData = null;
String query = "SELECT * FROM health_data WHERE user_id = ? ORDER BY record_date DESC LIMIT 1";
try (Connection conn = DatabaseConnection.getConnection();
PreparedStatement stmt = conn.prepareStatement(query)) {
stmt.setString(1, userId);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
healthData = new HealthData();
healthData.healthId = rs.getString("health_id");
healthData.userId = rs.getString("user_id");
healthData.recordDate = rs.getDate("record_date");
healthData.sleepDuration = rs.getInt("sleep_duration");
healthData.heartRate = rs.getInt("heart_rate");
healthData.bloodPressure = rs.getString("blood_pressure");
healthData.steps = rs.getInt("steps");
healthData.calories = rs.getDouble("calories");
}
} catch (SQLException e) {
e.printStackTrace();
}
return healthData;
}
通过获取健康数据生成建议,并保存到报告表中:
@Service
public class HealthReportService {
public HealthReport createAndSaveHealthReport(String userId, String reportType, String content, String suggestions) {
HealthReport report = new HealthReport();
report.setUserId(userId);
report.setReportType(reportType);
report.setContent(content);
report.setSuggestions(suggestions);
report.setReportDate(new Date());
healthReportRepository.save(report);
return report;
}
}
findTopByUserIdOrderByReportDateDesc
返回 Optional.empty()
。Service
层处理空值逻辑,通过 orElse(null)
避免空指针异常。@Column
显式指定字段映射关系。spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
通过本次开发实践,我深入掌握了 Spring Data JPA 的查询与数据持久化技巧,同时在健康报告生成与健康数据查询方面积累了实战经验。这些技术为团队项目提供了可靠的数据管理基础,也提升了开发效率。