“可插入” DAO 层通常/总是基于接口 DAO。例如,让我们考虑一个非常通用的简单的:
public interface GenericDAO <T, K extends Serializable> {
List<T> getAll(Class<T> typeClass);
T findByKey(Class<T> typeClass, K id);
void update(T object);
void remove(T object);
void insert(T object);
}
(这就是Morphia 的通用 DAO中的内容)
然后您可以开发不同的几种通用 DAO 实现,您可以在其中找到不同的字段(反映在构造函数参数、setter 和 getter 等中)。让我们假设一个基于 JDBC 的:
public class GenericDAOJDBCImpl<T, K extends Serializable> implements GenericDAO<T, K extends Serializable> {
private String db_url;
private Connection;
private PreparedStatement insert;
// etc.
}
一旦实现了通用 DAO(对于具体的数据存储),获得具体的 DAO 将不费吹灰之力:
public interface PersonDAO extends GenericDAO<Person, Long> {
}
和
public class PersonDAOJDBCImpl extends GenericDAOJDBCImpl<Person, Long> implements PersonDAO {
}
(顺便说一句,你在Morphia 的 BasicDAO中拥有的是 MongoDB 的通用 DAO 的实现)。
可插拔架构中的第二件事是选择具体的 DAO 实现。我建议您阅读Apress: Pro Spring 2.5的第 2 章(“将 Spring 放入“Hello World”),以逐步了解工厂和依赖注入。