From 50da6d65fbaabc10129e7dd23bf2ed92056efb20 Mon Sep 17 00:00:00 2001 From: Vitaliy Fedoriv Date: Sat, 12 Nov 2016 22:29:16 +0200 Subject: [PATCH] Improve findById() in JdbcVetRepository and format code --- .../jdbc/JdbcVetRepositoryExtImpl.java | 105 +++++++++++++----- 1 file changed, 75 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryExtImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryExtImpl.java index 56422bf85..338423306 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryExtImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryExtImpl.java @@ -1,6 +1,27 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.springframework.samples.petclinic.repository.jdbc; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.sql.DataSource; @@ -15,61 +36,85 @@ import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.simple.SimpleJdbcInsert; import org.springframework.orm.ObjectRetrievalFailureException; +import org.springframework.samples.petclinic.model.Owner; +import org.springframework.samples.petclinic.model.PetType; +import org.springframework.samples.petclinic.model.Specialty; import org.springframework.samples.petclinic.model.Vet; import org.springframework.samples.petclinic.repository.VetRepositoryExt; +import org.springframework.samples.petclinic.util.EntityUtils; import org.springframework.stereotype.Repository; +/** + * @author Vitaliy Fedoriv + * + */ + @Repository @Qualifier("VetRepositoryExt") public class JdbcVetRepositoryExtImpl extends JdbcVetRepositoryImpl implements VetRepositoryExt { - - private NamedParameterJdbcTemplate namedParameterJdbcTemplate; - private SimpleJdbcInsert insertVet; + private NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private SimpleJdbcInsert insertVet; @Autowired public JdbcVetRepositoryExtImpl(DataSource dataSource, JdbcTemplate jdbcTemplate) { super(jdbcTemplate); - this.insertVet = new SimpleJdbcInsert(dataSource) - .withTableName("vets") - .usingGeneratedKeyColumns("id"); - this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); + this.insertVet = new SimpleJdbcInsert(dataSource).withTableName("vets").usingGeneratedKeyColumns("id"); + this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); } @Override public Vet findById(int id) throws DataAccessException { - Vet vet; - try { - Map params = new HashMap<>(); - params.put("id", id); - vet = this.namedParameterJdbcTemplate.queryForObject( - "SELECT id, first_name, last_name FROM vets WHERE id= :id", - params, - BeanPropertyRowMapper.newInstance(Vet.class)); - } catch (EmptyResultDataAccessException ex) { - throw new ObjectRetrievalFailureException(Vet.class, id); - } - return vet; + Vet vet; + try { + Map vet_params = new HashMap<>(); + vet_params.put("id", id); + vet = this.namedParameterJdbcTemplate.queryForObject( + "SELECT id, first_name, last_name FROM vets WHERE id= :id", + vet_params, + BeanPropertyRowMapper.newInstance(Vet.class)); + + final List specialties = this.namedParameterJdbcTemplate.query( + "SELECT id, name FROM specialties", vet_params, BeanPropertyRowMapper.newInstance(Specialty.class)); + + final List vetSpecialtiesIds = this.namedParameterJdbcTemplate.query( + "SELECT specialty_id FROM vet_specialties WHERE vet_id=:id", + vet_params, + new BeanPropertyRowMapper() { + @Override + public Integer mapRow(ResultSet rs, int row) throws SQLException { + return rs.getInt(1); + } + }); + for (int specialtyId : vetSpecialtiesIds) { + Specialty specialty = EntityUtils.getById(specialties, Specialty.class, specialtyId); + vet.addSpecialty(specialty); + } + + } catch (EmptyResultDataAccessException ex) { + throw new ObjectRetrievalFailureException(Vet.class, id); + } + return vet; } @Override public void save(Vet vet) throws DataAccessException { - BeanPropertySqlParameterSource parameterSource = new BeanPropertySqlParameterSource(vet); - if (vet.isNew()) { - Number newKey = this.insertVet.executeAndReturnKey(parameterSource); - vet.setId(newKey.intValue()); - } else { - this.namedParameterJdbcTemplate.update( - "UPDATE vets SET first_name=:firstName, last_name=:lastName WHERE id=:id", - parameterSource); - } + BeanPropertySqlParameterSource parameterSource = new BeanPropertySqlParameterSource(vet); + if (vet.isNew()) { + Number newKey = this.insertVet.executeAndReturnKey(parameterSource); + vet.setId(newKey.intValue()); + } else { + this.namedParameterJdbcTemplate + .update("UPDATE vets SET first_name=:firstName, last_name=:lastName WHERE id=:id", parameterSource); + } } @Override public void delete(Vet vet) throws DataAccessException { Map params = new HashMap<>(); - params.put("id", vet.getId()); - this.namedParameterJdbcTemplate.update("DELETE FROM vets WHERE id=:id", params); + params.put("id", vet.getId()); + this.namedParameterJdbcTemplate.update("DELETE FROM vets WHERE id=:id", params); } }