我正在开发一个小型餐厅管理应用程序,用于跟踪食品订单。我正在创建一个可以处理所有SQL查询的类(为了方便我的其他队友使用),我想知道这样做的一些最佳实践。该类将非常具体地处理连接/断开/插入和查询,并且仅接受基本参数。我有以下设计问题:异常处理(如果用户必须处理它们,我更喜欢它们没有),连接(如果连接在每个查询上重新建立和关闭,或者只是在完成一组查询时),并显示结果(我应该如何最优雅地转换ResultSet,它可以抛出异常,执行一组稳定的最终结果)。
TLDR; 包装MySQL类的最佳设计是什么,这样才能使类的用户只需要使用内置方法。
答案 0 :(得分:2)
2013年,我们拥有足够的框架,使数据库访问比普通JDBC更简单。
请查看jOOQ了解类似Active Record的API,或者Hibernate查看更复杂的内容。如果您想要了解未来,请查看Spring Data。
答案 1 :(得分:0)
根据您的要求,我建议您使用Hibernate框架。它具有您提到的所有功能。此外,它还有助于将表直接映射到简单的POJO。
使用Hibernate,您可以在xml配置文件中设置所需的属性,然后您可以随意更改它以获得所需的属性。异常处理是用户永远不必做的事情 - Hibernate为此提供了功能。由于它将表映射到POJO,因此可以轻松处理ResultSet。
答案 2 :(得分:0)
我会尝试提供你自己的答案。
让你的api中的方法可以投掷,这是一种常见的api练习。
ResultSet
就像List<HashMap<String, dataType>>
:
创建一个List,并将返回的每条记录填充到一个 HashMap,其中fieldName是键,返回的数据是 然后将值添加到List中。对于每条记录,创建一个新的HashMap并重复。
您可以在resultSet上使用metaData来获取返回的列数以及返回的列的名称。
//rs is a ResultSet
rs.getMetaData().getTableName(int Column);
rs.getMetaData().getColumnCount();
选择查询的示例代码:
private List<HashMap<String,Object>> selectQuery(sql) throws SqlException {
//assumption that connection is a global
List<HashMap<String, Object>> results = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> record = null;
PreparedStatement pStmt = conn.prepareStatement(sql);
ResultSet rs = pStmt.executeQuery();
while (rs.next() {
record = new HashMap<String, Object>();
for (int i : rs.getMetaData().getColumnCount()) {
record.put(rs.getMetaData().getTableName(i), rs.getString(i));
}
results.add(record);
}
rs.close();
return results;
}
连接 -
保持连接打开,直到它们关闭。开发者应该 你应该知道你应该总是关闭你的连接 造成泄密。
答案 3 :(得分:0)
这是我的看法:
该课程将处理连接
您应该使用连接池来获取和管理连接。
断开
应通过每个工作单元/用例的服务获取连接。该服务负责从最终块中关闭连接的池中获取连接,以及提交或回滚事务。
插入和查询
容易做到。
非常具体,只会采用基本参数
必须接受所需的任何数据。你不懂基本的。
我有以下设计问题:异常处理(应该是 用户必须处理它们,我更喜欢它们没有),
持久性异常永远不应该从服务层冒出来。它应该告知用户发生了什么,但不是通过发送异常。用户友好的消息是首选。
连接(应该重新建立连接并关闭 每个查询或只是在完成一组查询时),
连接应尽可能在最窄的范围内打开。将它们与工作单元/交易相关联。游泳池摊销费用。
并显示结果(我应该如何最优雅地转换 ResultSet可以抛出异常,执行稳定的最终集合 结果)。
ResultSet永远不应该离开持久层。关闭它的责任将会丢失。您应该将所有结果集映射到对象或对象集合中并返回该对象。
查看Spring JDBC模板。它已经排除了大部分内容。
我不推荐使用Hibernate。