DAO 可以使用本身封装了数据源对象的对象吗?

Can DAO use an object that itself incapsulates a dataSource object?

我有一个 DAO,(称之为 PlayerDao)具有以下方法:

public interface PlayerDao{
    //Other methods
    public Collection<Integer> getPlayerRegisteredIds();
}

现在我需要为该方法提供两个实现:

。直接在数据源上执行 select 查询,如下所示:

public class PlayerDaoImpl implements PlayerDao{

    private DataSource dataSource; //javax.sql.DataSource
    //Other methods
    public Collection<Integer> getPlayerRegisteredIds(){
        Collection<Integer> result = new ArrayList<Integer>();
        String query = "SELECT id FROM player WHERE registered_today = true";
        //Executing the query with the dataSource

        return result;
}

II。按部分执行此查询。我的意思是将查询分成 4 个不相交的部分,并将每个部分执行到一个单独的线程中(为了提高性能)。

 public class ConcurrentPlayerDaoImpl implements PlayerDao{
    private static final NUMBER_OF_THREADS = 4;
    private DataSource dataSource; //javax.sql.DataSource
    //Other methods
    public Collection<Integer> getPlayerRegisteredIds(){
        final Set<Integer> set = Collections.synchronizedSet(new HashSet<Integer>());
        //It's going to consist of 4 queries 
        List<String> queriesToConcurrentExecution = new ArrayList<String>();     
        //Obtaining the queries
        ExecutorService executor = Executors.newFixedThreadPool(NUMBER_OF_THREADS);
        for(final String sql : queriesToConcurrentExecution){
            executor.execute(new Runnable() {
                @SuppressWarnings("unchecked")
                @Override
                public void run() {
                    List<Integer> l = new JdbcTemplate(dataSource).queryForList(sql, Integer.class);
                    set.addAll(l);
                }
            });
        }
        executor.shutdown();

        return set;
}

问题是 //Other methods 的实现在这两种情况下是相同的。所以我倾向于将 getPlayerRegisteredIds() 包装到某个接口中,然后通过其构造函数为同一个 Dao class 提供两种不同的实现。对吗?

official DAO-pattern's description 中说 DAO 就像是业务对象和 DataSource 之间的适配器,但在我的例子中它使用了一个本身使用数据源的对象。

问题:我们是否应该始终坚持在 DAO 中直接使用数据源对象?这是必要的要求吗?

我认为您计划使用的内容没有任何根本性错误:DAO 使用并包含该特定方法的接口是一种 策略 ,并且 DAO 将委托给一个或其他策略实现。

DAO 仍然具有包含 daa 访问方法的作用,并且可以按照自己想要的方式自由实现它们,即使这包括委托给其他组件。