将JDBC ResultSet转换为泛型类型?

时间:2013-10-16 17:26:44

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

我正在尝试为我的应用程序构建一个简单,轻量级的“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 ???;
    }
}

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

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

2 个答案:

答案 0 :(得分:1)

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

或者,更好的是,只使用Spring JDBC模板。他们编写了比你或我想象的更好的代码。为简单起见,难以达到顶峰。

答案 1 :(得分:0)

在我看来,你需要的是BaseDAO是抽象的变换方法。然后可以通过扩展类(protected abstract T transform(ResultSet))来覆盖方法(例如AnimalDAO),以便扩展类知道如何转换它自己的类型。然后doSQL方法将返回类似return transform(result);

的返回行