Имитируя больнице


У меня есть Java-программу, которая имитирует больницу. Для этого у меня есть две разные базы данных, MySQL и MS SQL, то со столами для управления пациентами. Пользователь может решить, какую базу данных он хочет использовать.

Для каждого типа БД, я создал PatientRepository который реализует мой PatientRepository интерфейс, оба из которых работают с помощью JDBC шаблон.

Потому что некоторые синтаксис отличается между этими базами данных (например, SELECT TOP 1 * FROM tbl_patient ORDER BY NEWID() и SELECT * FROM tbl_patient ORDER BY RAND() LIMIT 1) Я написал две реализации PatientRepository. Но я вижу там много лишнего кода, который я хотел бы избежать.

PatientRepository реализации:

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;
}

}

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;

    }

    }


108
1
задан 10 января 2018 в 09:01 Источник Поделиться
Комментарии
1 ответ

Вы могли бы использовать абстрактный класс, который содержал общие правила внедрения и использования производных классов для реализации тех методов, которые меняются в зависимости от реализации

 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
ответ дан 10 января 2018 в 03:01 Источник Поделиться