JDBC访问器类的最佳实践

时间:2014-02-25 16:59:38

标签: java mysql jdbc

我正在开发一个小型餐厅管理应用程序,用于跟踪食品订单。我正在创建一个可以处理所有SQL查询的类(为了方便我的其他队友使用),我想知道这样做的一些最佳实践。该类将非常具体地处理连接/断开/插入和查询,并且仅接受基本参数。我有以下设计问题:异常处理(如果用户必须处理它们,我更喜欢它们没有),连接(如果连接在每个查询上重新建立和关闭,或者只是在完成一组查询时),并显示结果(我应该如何最优雅地转换ResultSet,它可以抛出异常,执行一组稳定的最终结果)。

TLDR; 包装MySQL类的最佳设计是什么,这样才能使类的用户只需要使用内置方法。

4 个答案:

答案 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。