首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟医院

模拟医院
EN

Code Review用户
提问于 2018-01-10 09:04:06
回答 1查看 70关注 0票数 1

我有一个模拟医院的Java程序。为此,我有两个不同的数据库,MySql和MySql,带有表来管理病人。用户可以决定要使用哪个数据库。

对于每种数据库类型,我创建了一个PatientRepository,它实现了我的PatientRepository接口,这两个接口都使用一个JDBC模板。

由于这些数据库之间的语法有些不同(例如,SELECT TOP 1 * FROM tbl_patient ORDER BY NEWID()SELECT * FROM tbl_patient ORDER BY RAND() LIMIT 1),所以我编写了两个PatientRepository实现。但是我发现有很多多余的代码,我喜欢避免。

PatientRepository实现:

代码语言:javascript
复制
public class PatientRepositoryMSSqlImpl implements PatientRepository {

private JdbcTemplate template;
private PatientGenerator patientGenerator;


public PatientRepositoryMSSqlImpl(DataSource dataSource, PatientGenerator patientGenerator) {
    this.patientGenerator = patientGenerator;
    this.template = new JdbcTemplate(dataSource);
}


public void insertPatient(Patient patient) {
    template.update("INSERT INTO tbl_patient(lastname, firstname, gender, birthday) VALUES(?,?,?,?)",
            patient.getLastname(), patient.getFirstname(), patient.getGender(), patient.getBirthday().toString());
}

public void insertListOfPatients(List<Patient> allPatients) {
    for (Patient patient : allPatients) {
        insertPatient(patient);
    }
}

public Patient getRandomPatient() {
    String sql = "SELECT TOP 1 * FROM tbl_patient ORDER BY NEWID()";
    Patient patient = (Patient) template.queryForObject(sql, new PatientRowMapper());
    return patient;
}

public Patient admitRandomPatient() {
    Patient patient = getRandomPatient();
    patient.setDepartment(patientGenerator.getRandomDepartment());
    patient.setWard(patientGenerator.getRandomWard());
    patient.setAdmissionDateTime(LocalDateTime.now());
    patient.setStatus("I");
    template.update(
            "INSERT INTO tbl_inpatients(id, ward, department, admissionDate, patientStatus) VALUES(?,?,?,?,?)",
            patient.getId(), patient.getWard(), patient.getDepartment(), patient.getAdmissionDateTime().toString(),
            patient.getStatus());
    return patient;
}

public Patient getRandomInpatient() {
    String sql = "SELECT TOP 1 * FROM tbl_inpatients ip, tbl_patient p WHERE p.id = ip.id ORDER BY NEWID()";
    Patient patient = (Patient) template.queryForObject(sql, new Object[] {}, new InPatientRowMapper());
    setPatientBasicData(patient);
    return patient;
}

public Patient setPatientBasicData(Patient patient) {
    String sql = "SELECT * FROM tbl_patient WHERE id = '" + patient.getId() + "'";
    Patient patientNew = (Patient) template.queryForObject(sql, new Object[] {}, new PatientRowMapper());
    patient.setLastname(patientNew.getLastname());
    patient.setFirstname(patientNew.getFirstname());
    patient.setGender(patientNew.getGender());
    patient.setBirthday(patientNew.getBirthday());
    return patient;
}

public Patient transferRandomPatient() {
    Patient patient = getRandomInpatient();
    patient.setPriorWard(patient.getWard());
    patient.setPriorDepartment(patient.getPriorDepartment());
    patient.setDepartment(patientGenerator.getRandomDepartment());
    patient.setWard(patientGenerator.getRandomWard());
    template.update("UPDATE tbl_inpatients SET ward = ?, department = ? WHERE id = ?", patient.getWard(),
            patient.getDepartment(), patient.getId());
    return patient;
}

public Patient dischargeRandomPatient() {
    Patient patient = getRandomInpatient();
    patient.setDischargeDateTime(LocalDateTime.now());
    insertFormerPatient(patient);
    template.update("DELETE FROM tbl_inpatients WHERE instance= ?", patient.getInstance());
    return patient;
}

public void insertFormerPatient(Patient patient) {
    template.update(
            "INSERT INTO tbl_formerpatients(instance, id, ward, department, admissionDate, dischargeDate) VALUES('"
                    + patient.getInstance() + "', '" + patient.getId() + "', '" + patient.getWard() + "', '"
                    + patient.getDepartment() + "', '" + patient.getAdmissionDateTime().toString() + "', '"
                    + patient.getDischargeDateTime().toString() + "')");
}

public int countPatients() {
    String sql = "SELECT COUNT(id) AS numberOfPatients FROM tbl_patient";
    return template.queryForObject(sql, Integer.class);
}

public int countInpatients() {
    String sql = "SELECT COUNT(id) AS numberOfPatients FROM tbl_inpatients";
    return template.queryForObject(sql, Integer.class);
}

public LocalDate parseBirthday(String birthday) {
    LocalDate localDate = LocalDate.parse(birthday);
    return localDate;
}

}
代码语言:javascript
复制
public class PatientRepositoryMySqlImpl implements PatientRepository {


    private JdbcTemplate template;
    private PatientGenerator patientGenerator;


    public PatientRepositoryMySqlImpl(DataSource dataSource, PatientGenerator patientGenerator) {
        this.patientGenerator = patientGenerator;
        this.template = new JdbcTemplate(dataSource);
    }


    public void insertPatient(Patient patient) {
        template.update("INSERT INTO tbl_patient(lastname, firstname, gender, birthday) VALUES(?,?,?,?)",
                patient.getLastname(), patient.getFirstname(), patient.getGender(), patient.getBirthday().toString());
    }

    public void insertListOfPatients(List<Patient> allPatients) {
        for (Patient patient : allPatients) {
            insertPatient(patient);
        }
    }

    public Patient getRandomPatient() {
        String sql = "SELECT * FROM tbl_patient ORDER BY RAND() LIMIT 1";
        Patient patient = (Patient) template.queryForObject(sql, new PatientRowMapper());
        return patient;
    }

    public Patient admitRandomPatient() {
        Patient patient = getRandomPatient();
        patient.setDepartment(patientGenerator.getRandomDepartment());
        patient.setWard(patientGenerator.getRandomWard());
        patient.setAdmissionDateTime(LocalDateTime.now());
        patient.setStatus("I");
        template.update(
                "INSERT INTO tbl_inpatients(id, ward, department, admissionDate, patientStatus) VALUES(?,?,?,?,?)",
                patient.getId(), patient.getWard(), patient.getDepartment(), patient.getAdmissionDateTime().toString(),
                patient.getStatus());
        return patient;
    }

    public Patient getRandomInpatient() {
        String sql = "SELECT * FROM tbl_inpatients ORDER BY RAND() LIMIT 1";
        Patient patient = (Patient) template.queryForObject(sql, new Object[] {}, new InPatientRowMapper());
        setPatientBasicData(patient);
        return patient;
    }

    public Patient setPatientBasicData(Patient patient) {
        String sql = "SELECT * FROM tbl_patient WHERE id = '" + patient.getId() + "'";
        Patient patientNew = (Patient) template.queryForObject(sql, new Object[] {}, new PatientRowMapper());
        patient.setLastname(patientNew.getLastname());
        patient.setFirstname(patientNew.getFirstname());
        patient.setGender(patientNew.getGender());
        patient.setBirthday(patientNew.getBirthday());
        return patient;
    }

    public Patient transferRandomPatient() {
        Patient patient = getRandomInpatient();
        patient.setPriorWard(patient.getWard());
        patient.setPriorDepartment(patient.getPriorDepartment());
        patient.setDepartment(patientGenerator.getRandomDepartment());
        patient.setWard(patientGenerator.getRandomWard());
        template.update("UPDATE tbl_inpatients SET ward = ?, department = ? WHERE id = ?", patient.getWard(),
                patient.getDepartment(), patient.getId());
        return patient;
    }

    public Patient dischargeRandomPatient() {
        Patient patient = getRandomInpatient();
        patient.setDischargeDateTime(LocalDateTime.now());
        insertFormerPatient(patient);
        template.update("DELETE FROM tbl_inpatients WHERE `instance`= ?", patient.getInstance());
        return patient;
    }

    public void insertFormerPatient(Patient patient) {
        template.update(
                "INSERT INTO tbl_formerpatients(`instance`, `id`, ward, department, admissionDate, dischargeDate) VALUES('"
                        + patient.getInstance() + "', '" + patient.getId() + "', '" + patient.getWard() + "', '"
                        + patient.getDepartment() + "', '" + patient.getAdmissionDateTime().toString() + "', '"
                        + patient.getDischargeDateTime().toString() + "')");
    }

    public int countPatients() {
        String sql = "SELECT COUNT(*) FROM tbl_patient";
        return template.queryForObject(sql, Integer.class);
    }

    public int countInpatients() {
        String sql = "SELECT COUNT(*) FROM tbl_inpatients";
        return template.queryForObject(sql, Integer.class);
    }

    public LocalDate parseBirthday(String birthday) {
        LocalDate localDate = LocalDate.parse(birthday);
        return localDate;

    }

    }
EN

回答 1

Code Review用户

回答已采纳

发布于 2018-01-10 15:37:17

您可以使用包含共享实现代码的抽象类,并使用派生类实现那些根据实现而改变的方法。

代码语言:javascript
复制
 public abstract class AbstractPatientRepository
 {
      public void insertListOfPatients(List<Patient> allPatients) {
          for (Patient patient : allPatients) {
              insertPatient(patient);
      }

      public abstract Patient getRandomPatient();
 }

 public class PatientRepositoryMSSqlImpl extends AbstractPatientRepository
 {


     public Patient getRandomPatient() {
         String sql = "SELECT TOP 1 * FROM tbl_patient ORDER BY NEWID()";
         Patient patient = (Patient) template.queryForObject(sql, new          PatientRowMapper());
         return patient;
     }

 }
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/187671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档