一次又一次,我发现自己创建了一个数据库实用程序类,它有多个函数,这些函数几乎做了相同的事情,但对结果集的处理略有不同。
例如,考虑一个Java类,它有许多函数,这些函数都是这样的:

public void doSomeDatabaseOperation() {
    Connection con = DriverManager.getConnection("jdbc:mydriver", "user", "pass");
    try {
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT whatever FROM table"); // query will be different each time
        while (rs.next()) {
            // handle result set - differently each time
        }
    } catch (Exception e) {
        // handle
    } finally {
        con.close();
    }
}

现在想象一个类有20个这样的函数。
如您所见,大量的样板文件(打开一个连接,try finally block),唯一改变的就是查询和处理结果集的方式。这种类型的代码出现在许多语言中(考虑到您没有使用orm)。
如何管理数据库实用程序类以减少代码重复?在您的语言/框架中,典型的db实用程序类是什么样子的?

最佳答案

我在我的一个项目中所做的方式是,我遵循spring对jdbc模板所做的操作,并提出了一个查询框架。基本上创建一个公共类,它可以接受select语句或pl/sql调用和绑定参数。如果查询返回resultset,则还要传递行映射器。框架将调用此rowmapper对象,以将每一行转换为任何类型的对象。
示例-

Query execute = new Query("{any select or pl/sql}",
                          // Inputs and Outputs are for bind variables.
                          new SQL.Inputs(Integer.class, ...),
                          // Outputs is only meaningful for PL/SQL since the
                          // ResultSetMetaData should be used to obtain queried columns.
                          new SQL.Outputs(String.class));

如果您想要rowmapper-
Query execute = new Query("{any select or pl/sql}",
                          // Inputs and Outputs are for bind variables.
                          new SQL.Inputs(Integer.class, ...),
                          // Outputs is only meaningful for PL/SQL since the
                          // ResultSetMetaData should be used to obtain queried columns.
                          new SQL.Outputs(String.class), new RowMapper() {

        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            Actor actor = new Actor();
            actor.setFirstName(rs.getString("first_name"));
            actor.setSurname(rs.getString("surname"));
            return actor;
        });

最后一个row类是输出,如果您通过了rowmapper,它将具有对象列表-
for (Row r : execute.query(conn, id)) {
  // Handle the rows
}

你可以去花哨和使用模板,这样类型安全是有保证的。

关于database - 设计通用数据库实用程序类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3906418/

10-09 00:16