2017-09-12 67 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; 
    } 
}