【问题标题】:Converting JDBC ResultSet to generic type?将 JDBC ResultSet 转换为泛型类型?
【发布时间】:2013-10-24 22:45:35
【问题描述】:

我正在尝试为我的应用构建一个简单、轻量级的“DAO 层”,它只使用纯 JDBC(没有什么像 Hibernate、TopLink、MyBatis 等花哨的东西)。

public class AnimalDAO extends BaseDAO<Animal> {
    private AnimalType type;
    private String name;

    public void insertAnimal(Animal animal) {
        StingBuilder sql = new StringBuilder();
        sql.append("INSERT INTO animals (");
        sql.append("animal_type_id, animal_name ) VALUES (");
        sql.append(animal.getType().getId());
        sql.append(animal.getName());
        sql.append(" )");

        doSQL(sql.toString());
    }
}

public class BaseDAO<T> {
    private Long id;

    protected T doSQL(String sql) {
        // Typical JDBC code to hit a database with the "sql" query and return a ResultSet.
        ResultSet result = queryDatabase(sql);

        // Now, how do I turn "result" into type T such that, in the case of 
        // AnimalDAO#insertAnimal(Animal), result gets converted into an Animal?
        return ???;
    }
}

所以我们的想法是在BaseDAO 中有一个doSQL(String) 方法来处理所有样板的JDBC 内容(制作准备好的语句、连接池、用于事务提交的try-catch 块等)。然后,像Animal 这样的子类只需要告诉doSQL 执行哪个查询。

问题是,我不确定如何将 JDBC ResultSet 转换为适当的 T 泛型类型,在 AnimalDAO 的情况下是 Animal。有任何想法吗?提前致谢!

【问题讨论】:

    标签: java generics jdbc data-access-layer resultset


    【解决方案1】:

    是的,我会遵循 Spring JDBC 模板模型并引入 RowMapper 接口。让每种类型的对象告诉您如何管理它。

    或者,更好的是,只使用 Spring JDBC 模板。他们写的代码比你我写的都好。为了简单起见,很难超越它。

    【讨论】:

    • 同上重用点。如果您想尝试编写这种框架,请务必这样做。它非常欣赏现有的框架,并且肯定会增加对一般编程的理解。然而,正如@duffymo 所说,Spring 已经编写了它并对其进行了彻底的测试。最终发现自己走上了这条路,不要感到惊讶。
    【解决方案2】:

    在我看来,您需要的是 BaseDAO 使用抽象转换方法进行抽象。然后可以通过扩展类(AnimalDAO)覆盖该方法(例如protected abstract T transform(ResultSet)),以便扩展类知道如何转换自己的类型。然后doSQL方法会有一个类似return transform(result)的返回行;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多