我如何在不重复的情况下重写这些方法?
How can i rewrite this methods without duplication?
如何使这段代码不重复?
这种方法是相似的。
创建phone个号码的方法:
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;
}
}
我可以阅读哪些内容来解决我的代码中的类似问题?
我觉得你应该检查一下 Spring JDBC and it's callback-based 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;
}
});
"Separate what changes from what stays same" - Head First 设计模式。
您可以将从 Resultset 中提取数据(发生变化)的逻辑与准备语句和执行语句(不发生变化)分开
如果您不想从任何框架支持中获得帮助,您可以执行如下操作
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;
}
}
如何使这段代码不重复? 这种方法是相似的。
创建phone个号码的方法:
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;
}
}
我可以阅读哪些内容来解决我的代码中的类似问题?
我觉得你应该检查一下 Spring JDBC and it's callback-based 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;
}
});
"Separate what changes from what stays same" - Head First 设计模式。
您可以将从 Resultset 中提取数据(发生变化)的逻辑与准备语句和执行语句(不发生变化)分开
如果您不想从任何框架支持中获得帮助,您可以执行如下操作
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;
}
}