Java编写通用函数合并仅查询和返回类型不同的数据库查询方法
完全可以合并,你可以通过泛型+行映射函数的方案抽取公共的JDBC查询逻辑,把SQL语句、结果集转实体对象这两个差异点作为参数传入公共方法即可,改造后的代码如下:
首先是抽取的公共泛型查询方法:
private <T> ObservableList<T> queryAll(String sql, Function<ResultSet, T> rowMapper) { ObservableList<T> list = FXCollections.observableArrayList(); Connection connection = MyConnection.connection; try { Statement statement = connection.createStatement(); ResultSet rs = statement.executeQuery(sql); while (rs.next()) { T entity = rowMapper.apply(rs); list.add(entity); } } catch (Exception ex) { ex.printStackTrace(); } return list; }
接下来改造原有两个业务方法,逻辑可以简化为:
public ObservableList<Car> getAllCars() { return queryAll("SELECT * FROM cars", rs -> new Car( rs.getInt("ID"), rs.getInt("STYLE_ID"), rs.getString("MAKE"), rs.getString("MODEL"), rs.getInt("YEAR"), rs.getInt("PRICE") )); } public ObservableList<Style> getAllStyles() { return queryAll("SELECT * FROM styles", rs -> new Style( rs.getInt("ID"), rs.getString("NAME") )); }
方案说明
- 该方案依赖Java 8及以上版本支持的
Function<ResultSet, T>函数式接口,将不同实体类的结果集映射逻辑作为参数传入公共方法,所有重复的JDBC样板代码(连接获取、语句执行、结果集遍历、异常捕获)都统一收拢,完全消除了重复逻辑。 - 后续新增其他表的全量查询需求时,只需要写一行调用
queryAll的代码即可,不需要重复编写JDBC逻辑,扩展性更强。 - 你可以根据自己的需求补充资源释放逻辑,比如在
finally代码块中关闭ResultSet、Statement对象,避免数据库资源泄露,上面的公共方法暂时保留了原有代码的异常处理逻辑没有额外改动。
内容的提问来源于stack exchange,提问作者yaromchikV
相关产品推荐
相关产品推荐

