我正在尝试为我的应用程序构建一个简单,轻量级的“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
泛型类型,在AnimalDAO
为Animal
的情况下。有任何想法吗?提前谢谢!
答案 0 :(得分:1)
是的,我将遵循Spring JDBC模板模型并引入RowMapper接口。让每种类型的对象告诉您如何管理它。
或者,更好的是,只使用Spring JDBC模板。他们编写了比你或我想象的更好的代码。为简单起见,难以达到顶峰。
答案 1 :(得分:0)
在我看来,你需要的是BaseDAO是抽象的变换方法。然后可以通过扩展类(protected abstract T transform(ResultSet)
)来覆盖方法(例如AnimalDAO
),以便扩展类知道如何转换它自己的类型。然后doSQL方法将返回类似return transform(result)
;