“可插入”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> {
}
and
public class PersonDAOJDBCImpl extends GenericDAOJDBCImpl<Person, Long> implements PersonDAO {
}
(顺便说一句,你有什么Morphia 的 BasicDAO是 MongoDB 通用 DAO 的实现)。
可插拔架构中的第二件事是具体 DAO 实现的选择。我建议你阅读第 2 章Apress:Pro Spring 2.5(“将 Spring 放入“Hello World”)逐步了解工厂和依赖注入。