【问题标题】:How to implement sorting to a DAO method?如何实现对 DAO 方法的排序?
【发布时间】:2015-06-26 18:11:39
【问题描述】:

这个问题是 3 年前另一个人在这里提出的,但没有最终答案:Specify Ordering to a DAO Method

我的问题也是这样。我有一个 Student 类和一个实现 DAO 的 StudentDAOImpl 类。如何告诉我的方法 getAll 我希望所有学生按名称排序,而不会将调用者耦合到特定实现。我想知道几种方法来做到这一点,但我想知道最好的做法是什么。

非常感谢您的关注。

public class Student{
    private int id;
    private String name;

    public Student() {
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class Student{} 

public interface StudentDao{ 
    public LinkedList<Student> getAll(Student s, StudentSortCriterion sortBy); 
} 

public class StudentDaoImpl implements StudentDao{ 
     getAll(...){implementation/SQL Statement}
} 

【问题讨论】:

    标签: java dao


    【解决方案1】:

    抽象的看这个,需要传入如何排序的信息。这可以通过多种方式进行设计,但为了简单起见,可以排序的属性直接与学生类相关联;那么为什么不为可排序属性定义常量呢?

    无论如何,DAO 都需要对学生类有深入的了解(因为它必须知道如何创建它们),因此它可以响应学生类定义的参数:

    class Student {
        public static enum SortCriterion {
            ID,
            NAME
        }
        // ...
    }
    
    Collection<Student> getAll(SortCriterion sortBy, boolean descending) {
        switch (sortBy) {
        }
    }
    

    这将 DAO 与 student 耦合(没有坏处,它已经耦合),但 DAO 用户不需要知道排序是如何实际实现的。

    但出于任何正常目的,我宁愿让 DAO 实现排序;如果无论如何你 getAll() 学生,为什么不使用一个简单的普通比较器,可能很好地嵌入到学生中:

    class Student {
        public static interface Order {
            public final static Comparator<Student> ID = new Comparator() {
                // implemetation
            }
        }
    }
    

    进行 DAO 排序的唯一要点是它是否返回由数据库结果集支持的惰性集合。但是如果结果集那么大,那你为什么要使用 getAll()?

    思考点:排序 DAO 的用例是什么?

    【讨论】:

    • 我明白你的意思,我同意你的看法。我只想知道直接在 SQL 子句上使用 ORDER BY 排序是否比使用 Comparator 更快。如果不是或大致相同,那么 Comparator 将是一个不错的选择。所以,按照你建议的另一种方式,我们会有这样的东西吗? class Student{} class StudentDao{ public LinkedList getAll(Student s, StudentSortCriterion sortBy); } class StudentDaoImpl{ ... if sortBy == name then SELECT * ... ORDER BY SNAME } 此 getAll 将返回与作为参数传递的对象相似的所有对象。
    • @RobertoJúnior 我不知道数据库的排序是否比 java 快一点或慢一点,但在我看来,在这种情况下甚至不值得考虑;很难甚至衡量差异。另一点是,通过在应用程序级别排序,您可以将排序推迟到可能的最新点(可能是客户端 UI);而不是使用数据库服务器上的资源。从系统可扩展性的角度来看,我认为这是一个很好的权衡。
    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2016-02-15
    • 2016-10-05
    • 2012-06-14
    相关资源
    最近更新 更多