You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DAO类中可编写特定业务方法吗?以获取当日值班医生场景为例

当然可以在DAO类中加入特定方法——这不仅可行,还是更贴合业务的实践!

首先明确一点:DAO(数据访问对象)的核心职责是封装与实体相关的数据访问逻辑,它从来不是只能包含getAllXxx()、getXxxById()这类通用方法。针对你获取当日值班医生的需求,在DoctorDAO中编写特定查询方法完全合理,甚至是更优的选择。

你的当前方案可行,但可以做一点优化

你现在通过传入当日排班列表拼接SQL的方式能正常运行,但其实可以直接把日期筛选逻辑放到SQL层面,这样效率更高,代码也更简洁:

public List<Doctor> getDoctorsOnDutyToday() {
    String sql = "SELECT d.* FROM doctors d " +
                 "JOIN schedules s ON d.id = s.doctor_id " +
                 "WHERE s.schedule_date = CURDATE()";
    // 执行SQL并映射返回Doctor列表的逻辑
}

这样数据库会直接帮你完成筛选和关联,避免了在内存中处理排班列表、拼接ID的额外开销,也减少了出错的可能。

为什么不推荐“通用方法+外部筛选”?

如果用getAllSchedules()和getAllDoctors()再在业务层筛选,会带来几个问题:

  • 性能浪费:把所有排班和医生数据都查出来再筛选,当数据量变大时,内存和网络开销会显著增加;
  • 职责混乱:业务层本该专注于业务流程,却要处理数据筛选的细节,违背了单一职责原则;
  • 代码重复:如果多个业务场景都需要获取当日值班医生,你就得在多个地方重复写筛选逻辑,维护成本更高。

DAO中编写特定方法的最佳实践

  • 命名清晰:方法名要直接反映业务意图,比如getDoctorsOnDutyToday()就比getDoctorsWorkingToday()更直观;
  • 边界明确:只在DAO中处理数据访问相关的逻辑(比如查询、筛选、关联),复杂的业务计算(比如统计医生当月值班天数)还是放在业务层;
  • 复用优先:如果某个特定查询会在多个地方用到,一定要封装在DAO里,避免重复代码。

总的来说,你的方案完全可行,只要把SQL逻辑优化一下,就是非常规范的DAO设计。

内容的提问来源于stack exchange,提问作者dwight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:25:38