2017-09-12 1 views
2

중복없이이 코드를 만들려면 어떻게해야합니까? 이 방법은 비슷합니다.어떻게 중복없이이 방법을 다시 쓸 수 있습니까?

방법은 전화 번호를 만들 수 있습니다 :

private List<String> createPhoneNumbers(String sqlStatement, Long id) { 
     List<String> phones = new ArrayList<>(); 
     try (PreparedStatement statement = this.connection.prepareStatement(sqlStatement)) { 
      statement.setLong(1, id); 
      try (ResultSet resultSet = statement.executeQuery()) { 
       while (resultSet.next()) { 
        phones.add(resultSet.getString("phoneNumber")); 
       } 
       return phones; 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

방법을 친구 목록을 만들 :

private List<Account> createFriendList(String sqlStatement, Long id) { 
     List<Account> friends = new ArrayList<>(); 
     try (PreparedStatement statement = this.connection.prepareStatement(sqlStatement)) { 
      statement.setLong(1, id); 
      try (ResultSet resultSet = statement.executeQuery()) { 
       while (resultSet.next()) { 
        friends.add(createSimpleElement(resultSet)); 
       } 
       return friends; 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

방법 그룹 목록을 작성 :

private List<Group> createGroupList(String sqlStatement, Long id) { 
     List<Group> groups = new ArrayList<>(); 
     try (PreparedStatement statement = this.connection.prepareStatement(sqlStatement)) { 
      statement.setLong(1, id); 
      try (ResultSet resultSet = statement.executeQuery()) { 
       while (resultSet.next()) { 
        groups.add(createGroupFromResultSet(resultSet)); 
       } 
       return groups; 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

이 내 아주 나쁜 솔루션입니다.

//field values: 1- create String, 2 - createAccount, 3 - createGroup 
private <E> List<E> createList(String selectSql, Long id, int field) { 
    List<E> list = new ArrayList<>(); 
    try (PreparedStatement statement = this.connection.prepareStatement(selectSql)) { 
     statement.setLong(1, id); 
     try (ResultSet resultSet = statement.executeQuery()) { 
      while (resultSet.next()) { 
       switch (field) { 
        case 1: 
         list.add((E) resultSet.getString("phoneNumber")); 
         break; 
        case 2: 
         list.add((E) createSimpleElement(resultSet)); 
         break; 
        case 3: 
         list.add((E) createGroupFromResultSet(resultSet)); 
         break; 
       } 
      } 
      return list; 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

내 코드에서 비슷한 문제를 해결하기 위해 읽을 수있는 것은 무엇입니까?

+2

하지 마십시오. 한 가지 일을 잘 수행하는 방법을 사용하는 것이 좋습니다. 그리고 필요한 경우 항상 인터페이스 또는 추상 클래스를 사용할 수 있습니다. –

+0

u는 디자인 패턴을 읽고 코드를 작성하여 을 시도 할 수 있습니다. https://www.tutorialspoint.com/design_pattern/ – saurabh

답변

2

Spring JDBC을 확인하고 콜백 기반 JdbcTemplate 접근 방식을 사용하는 것이 좋습니다. 당신이 멀리 떨어져있는 모든 상용구 (데이터베이스 연결, 트랜잭션, 예외 변환 등)를 추상화하고 응용 프로그램 코드에 집중할 수있게합니다.

샘플 :

List<Actor> actors = this.jdbcTemplate.query(
     "select first_name, last_name from t_actor", 
     new RowMapper<Actor>() { 
      public Actor mapRow(ResultSet rs, int rowNum) throws SQLException { 
       Actor actor = new Actor(); 
       actor.setFirstName(rs.getString("first_name")); 
       actor.setLastName(rs.getString("last_name")); 
       return actor; 
      } 
     }); 
1

"별도 무엇을 동일하게 유지 것과 변화"- 헤드 퍼스트 디자인 패턴.

당신은 문을 준비하고 당신은 당신이하는 것을 원하지 않는 경우에는 다음과 같이 뭔가를 할 수

(변경되지 않음) 명령문을 실행에서 (변경) 결과 집합에서 데이터를 추출 할 수있는 로직을 분리 할 수 ​​있습니다 모든 프레임 워크 지원에서의 도움

public interface GenericDao { 
    ResultSet find(String sqlStatement, Long id); 
} 

public class GenericDaoImpl extends GenericDao { 
    @Override 
    public ResultSet find(String sqlStatement, Long id) { 
     try (PreparedStatement statement = this.connection.prepareStatement(sqlStatement)) { 
      statement.setLong(1, id); 
      try (ResultSet resultSet = statement.executeQuery()) { 
       return resultSet; 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

public interface ContactDao { 
    List<String> createPhoneNumbers(String sqlStatement, Long id); 
    List<Account> createFriendList(String sqlStatement, Long id); 
    List<Group> createGroupList(String sqlStatement, Long id); 
} 

public class ContactDaoImpl extends ContactDao{ 
    private GenericDao genericDao; 

    ContactDaoImpl(GenericDao genericDao) { 
     this.genericDao = genericDao; 
    } 

    @Override 
    public List<String> createPhoneNumbers(String sqlStatement, Long id) { 
     ResultSet resultSet = this.genericDao.executeSqlQuery(sqlStatement, id); 
     while (resultSet.next()) { 
      phones.add(resultSet.getString("phoneNumber")); 
     } 
     return phones; 
    } 

    @Override 
    public List<Account> createFriendList(String sqlStatement, Long id) { 
     ResultSet resultSet = this.genericDao.executeSqlQuery(sqlStatement, id); 
     while (resultSet.next()) { 
      friends.add(createSimpleElement(resultSet)); 
     } 
     return friends; 
    } 

    @Override 
    public List<Group> createGroupList(String sqlStatement, Long id) { 
     ResultSet resultSet = this.genericDao.executeSqlQuery(sqlStatement, id); 
     while (resultSet.next()) { 
      groups.add(createGroupFromResultSet(resultSet)); 
     } 
     return groups; 
    } 
} 
관련 문제