【发布时间】:2014-07-04 08:39:21
【问题描述】:
我的 Java 项目有一个使用 Java API JDBC 的 DAO 层; JDBC 返回 ResultSets 以从数据库中获取信息。
考虑到分层的编程范式,将ResultSet对象返回业务层并将信息提取到其中是否正确?
根据层定义,业务层有责任将信息包装在领域对象(bean 等)中。但另一方面,它还没有看到 DAO 组件。
我附上这段代码来展示我的范例:
public static Hashtable<String, TreeSet<String>> getCodesByEditorial(Vector<Integer> familiesVector) throws Exception {
DriverManager.registerDriver((Driver) Class.forName("ianywhere.ml.jdbcodbc.IDriver").newInstance());
Connection con = DriverManager.getConnection("jdbc:odbc:DSN=DBLIB");
String sqlQuery =
"SELECT re.codigo, li.editorial FROM li_li li " +
"LEFT OUTER JOIN tl_recambio re ON li.codigo = re.codigo " +
"WHERE li.editorial IS NOT NULL AND re.familia IN (" + buildFamilies(familiesVector) + ")" ;
PreparedStatement ps = con.prepareStatement(sqlQuery);
ResultSet res = ps.executeQuery();
//THIS CODE SHOULD BE INTO DAO LAYER????
Hashtable<String, TreeSet<String>> codesHashTree = new Hashtable<String, TreeSet<String>>();
while (res.next()) {
String code = res.getString("CODIGO");
String editorial = res.getString("EDITORIAL");
if (editorial != null) {
TreeSet<String> bookTreeSet = codesHashTree.get(editorial);
if (bookTreeSet == null) {
bookTreeSet = new TreeSet<String>();
}
bookTreeSet.add(code);
codesHashTree.put(editorial, bookTreeSet);
}
}
con.close();
return codesHashTree;
}
【问题讨论】:
-
从技术上讲,您可能会使用
CachedRowSet实现(它扩展了ResultSet接口),但泄漏数据库抽象通常是糟糕设计的标志(尤其是当它们是需要的资源时)被关闭,就像ResultSet)。
标签: java jakarta-ee jdbc dao