0

我正在尝试为我的应用程序构建一个简单、轻量级的“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执行哪个查询。

问题是,我不确定如何将 JDBCResultSet转换为适当的T泛型类型,在AnimalDAOis Animal. 有任何想法吗?提前致谢!

4

2 回答 2

1

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

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

于 2013-10-16T17:29:39.807 回答
0

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

于 2013-10-16T17:31:30.783 回答