我有一个模拟医院的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实现:
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;
}
}发布于 2018-01-10 15:37:17
您可以使用包含共享实现代码的抽象类,并使用派生类实现那些根据实现而改变的方法。
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;
}
}https://codereview.stackexchange.com/questions/187671
复制相似问题