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

デザインパターンを読んで、 をコードを書くことで試してみることができます。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; 
    } 
} 
関連する問題