From 8c7776599adb02e66fa8c86f12c246a7f48527df Mon Sep 17 00:00:00 2001 From: dnokov <dnokov1997@gmail.com> Date: Wed, 22 Nov 2023 20:54:33 +0200 Subject: [PATCH] Adding JDBC implementations for methods Adding JDBC implementation for findPetTypeByName and findSpecialtiesByName along with respective unit tests --- .../jdbc/JdbcPetTypeRepositoryImpl.java | 24 ++++++++++--- .../jdbc/JdbcSpecialtyRepositoryImpl.java | 29 +++++++++++---- .../AbstractClinicServiceTests.java | 36 ++++++++++++++++++- 3 files changed, 78 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java index ee958432..1835cb71 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java @@ -47,11 +47,11 @@ import org.springframework.stereotype.Repository; @Repository @Profile("jdbc") public class JdbcPetTypeRepositoryImpl implements PetTypeRepository { - + private NamedParameterJdbcTemplate namedParameterJdbcTemplate; - + private SimpleJdbcInsert insertPetType; - + @Autowired public JdbcPetTypeRepositoryImpl(DataSource dataSource) { this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); @@ -76,7 +76,23 @@ public class JdbcPetTypeRepositoryImpl implements PetTypeRepository { return petType; } - @Override + @Override + public PetType findByName(String name) throws DataAccessException { + PetType petType; + try { + Map<String, Object> params = new HashMap<>(); + params.put("name", name); + petType = this.namedParameterJdbcTemplate.queryForObject( + "SELECT id, name FROM types WHERE name= :name", + params, + BeanPropertyRowMapper.newInstance(PetType.class)); + } catch (EmptyResultDataAccessException ex) { + throw new ObjectRetrievalFailureException(PetType.class, name); + } + return petType; + } + + @Override public Collection<PetType> findAll() throws DataAccessException { Map<String, Object> params = new HashMap<>(); return this.namedParameterJdbcTemplate.query( diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java index 5042cd0e..256f34d1 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java @@ -16,12 +16,11 @@ package org.springframework.samples.petclinic.repository.jdbc; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import javax.sql.DataSource; +import io.micrometer.core.instrument.binder.db.MetricsDSLContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; import org.springframework.dao.DataAccessException; @@ -43,9 +42,9 @@ import org.springframework.stereotype.Repository; @Repository @Profile("jdbc") public class JdbcSpecialtyRepositoryImpl implements SpecialtyRepository { - + private NamedParameterJdbcTemplate namedParameterJdbcTemplate; - + private SimpleJdbcInsert insertSpecialty; @Autowired @@ -72,7 +71,25 @@ public class JdbcSpecialtyRepositoryImpl implements SpecialtyRepository { return specialty; } - @Override + @Override + public List<Specialty> findByNameIn(Set<String> names) { + List<Specialty> specialties; + try{ + String sql = "SELECT id, name FROM specialties WHERE specialties.name IN (:names)"; + Map<String, Object> params = new HashMap<>(); + params.put("names", names); + specialties = this.namedParameterJdbcTemplate.query( + sql, + params, + new BeanPropertyRowMapper<>(Specialty.class)); + } catch (EmptyResultDataAccessException ex){ + throw new ObjectRetrievalFailureException(Specialty.class, names); + } + + return specialties; + } + + @Override public Collection<Specialty> findAll() throws DataAccessException { Map<String, Object> params = new HashMap<>(); return this.namedParameterJdbcTemplate.query( diff --git a/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java b/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java index eb3d8ea7..cdc081d9 100644 --- a/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java +++ b/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java @@ -25,6 +25,9 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -470,5 +473,36 @@ abstract class AbstractClinicServiceTests { assertThat(specialty).isNull(); } - + @Test + @Transactional + void shouldFindSpecialtyByName() { + Specialty specialty1 = new Specialty(); + specialty1.setName("radiology"); + specialty1.setId(1); + Specialty specialty2 = new Specialty(); + specialty2.setName("surgery"); + specialty2.setId(2); + Specialty specialty3 = new Specialty(); + specialty3.setName("dentistry"); + specialty3.setId(3); + List<Specialty> expectedSpecialties = List.of(specialty1, specialty2, specialty3); + Set<String> specialtyNames = expectedSpecialties.stream() + .map(Specialty::getName) + .collect(Collectors.toSet()); + Collection<Specialty> actualSpecialties = this.clinicService.findSpecialtiesByName(specialtyNames); + assertThat(actualSpecialties).isNotNull(); + assertThat(actualSpecialties.size()).isEqualTo(expectedSpecialties.size()); + for (Specialty expected : expectedSpecialties) { + assertThat(actualSpecialties.stream() + .anyMatch( + actual -> actual.getName().equals(expected.getName()) + && actual.getId().equals(expected.getId()))).isTrue(); + } + } + + @Test + void shouldFindPetTypeByName(){ + PetType petType = this.clinicService.findPetTypeByName("cat"); + assertThat(petType.getId()).isEqualTo(1); + } } -- GitLab