Java 如何在不重复的情况下重写此方法?

Java 如何在不重复的情况下重写此方法?,java,jdbc,dao,Java,Jdbc,Dao,如何使代码不重复? 这种方法是相似的 创建电话号码的方法: private List<String> createPhoneNumbers(String sqlStatement, Long id) { List<String> phones = new ArrayList<>(); try (PreparedStatement statement = this.connection.prepareStatement(sq

如何使代码不重复? 这种方法是相似的

创建电话号码的方法:

   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;
        }
    }
私有列表CreatePhoneNumber(字符串sqlStatement,长id){
列表电话=新的ArrayList();
try(PreparedStatement=this.connection.prepareStatement(sqlStatement)){
语句.setLong(1,id);
try(ResultSet ResultSet=statement.executeQuery()){
while(resultSet.next()){
add(resultSet.getString(“phoneNumber”);
}
归还电话;
}
}捕获(SQLE异常){
e、 printStackTrace();
返回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;
        }
    }
私有列表createFriendList(字符串sqlStatement,长id){
列出朋友=新建ArrayList();
try(PreparedStatement=this.connection.prepareStatement(sqlStatement)){
语句.setLong(1,id);
try(ResultSet ResultSet=statement.executeQuery()){
while(resultSet.next()){
添加(createSimpleElement(resultSet));
}
回报朋友;
}
}捕获(SQLE异常){
e、 printStackTrace();
返回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;
        }
    }
私有列表createGroupList(字符串sqlStatement,长id){
列表组=新的ArrayList();
try(PreparedStatement=this.connection.prepareStatement(sqlStatement)){
语句.setLong(1,id);
try(ResultSet ResultSet=statement.executeQuery()){
while(resultSet.next()){
添加(createGroupFromResultSet(resultSet));
}
返回组;
}
}捕获(SQLE异常){
e、 printStackTrace();
返回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;
    }
}
//字段值:1-创建字符串,2-创建帐户,3-创建组
私有列表createList(字符串selectSql,长id,int字段){
列表=新的ArrayList();
try(PreparedStatement=this.connection.prepareStatement(selectSql)){
语句.setLong(1,id);
try(ResultSet ResultSet=statement.executeQuery()){
while(resultSet.next()){
开关(现场){
案例1:
添加((E)resultSet.getString(“电话号码”);
打破
案例2:
添加((E)createSimpleElement(resultSet));
打破
案例3:
添加((E)createGroupFromResultSet(resultSet));
打破
}
}
退货清单;
}
}捕获(SQLE异常){
e、 printStackTrace();
返回null;
}
}

我能读些什么来解决代码中类似的问题呢?

听起来你应该去看看,这是一种基于回调的方法。它将所有样板文件(数据库连接、事务、异常转换等)从您身边抽象出来,让您能够专注于应用程序代码

样本:

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;
            }
        });
List actors=this.jdbcTemplate.query(
“从t_actor中选择名字和姓氏”,
新的行映射器(){
公共参与者mapRow(ResultSet rs,int rowNum)抛出SQLException{
Actor=新Actor();
actor.setFirstName(rs.getString(“first_name”);
actor.setLastName(rs.getString(“last_name”);
回归演员;
}
});
“将变化与保持不变的区分开来”-头先设计模式

您可以将从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;
    }
}
公共接口GenericDao{
结果集查找(字符串sqlStatement,长id);
}
公共类GenericDaoImpl扩展了GenericDao{
@凌驾
公共结果集查找(字符串sqlStatement,长id){
try(PreparedStatement=this.connection.prepareStatement(sqlStatement)){
语句.setLong(1,id);
try(ResultSet ResultSet=statement.executeQuery()){
返回结果集;
}
}捕获(SQLE异常){
e、 printStackTrace();
返回null;
}
}
}
公共接口ContactDao{
列出CreatePhoneNumber(字符串sqlStatement,长id);
List createFriendList(字符串sqlStatement,长id);
List createGroupList(字符串sqlStatement,长id);
}
公共类ContactDaoImpl扩展了ContactDao{
私有GenericDao GenericDao;
ContactDaoImpl(GenericDao GenericDao){
this.genericDao=genericDao;
}
@凌驾
公共列表CreatePhoneNumber(字符串sqlStatement,长id){
ResultSet ResultSet=this.genericDao.executeSqlQuery(sqlStatement,id);
while(resultSet.next()){
add(resultSet.getString(“phoneNumber”);
}
归还电话;
}
@凌驾
公共列表createFriendList(字符串sqlStatement,长id){
ResultSet ResultSet=this.genericDao.executeSqlQuery(sqlStatement,id);
while(resultSet.next()){
添加(createSimpleElement(resultSet));
}
回报朋友;
}
@凌驾
公共列表createGroupList(字符串sqlStatement,长id){
ResultSet ResultSet=this.genericDao.executeSqlQuery(sqlStatement,id);
while(resultSet.next()){
添加(createGroupFromResultSet(resultSet));
}
返回组;
}
}
不要这样做。信息技术