Каков наилучший подход к написанию объекта доступа к данным (DAO)?

Я пытался написать систему аутентификации пользователей на Java. Итак, я написал некоторый класс DAO. Сначала я написал абстрактный класс Persistence. Он отвечает за хранение некоторых общих атрибутов. И написал класс с именем User, расширяющий класс Persistence. Эти классы —

  public abstract class Persistance {

     private Date createdDate;
     private Date lastUpdatedDate;
     private long version;
     private boolean  isDeleted;


    //getter and setters
 }

и класс пользователя

 public class User extends  Persistance{
   private String username;
   private String password;
   private String passwordConfired;

  // getters and setters

 }

Мои вопросы: как лучше всего написать имя переменной, какое из них хорошее, createdDate или dateCreated, удалено или isDeleted и т. д.

И этот подход в порядке или есть более хороший подход? А как реализовать версионность данных?


person rokonoid    schedule 21.09.2011    source источник


Ответы (4)


Вы смешиваете DAO (объект доступа к данным) и VO (объект значения), также известный как DTO (объект передачи данных), в одном классе.

Пример использования интерфейса для поведения DAO (blammy и kpow могут быть веб-службой, базой данных oracle, базой данных mysql, гибернацией или чем-то значимым):

public interface UserDTO
{
    boolean deleteUser(String userId);
    UserVO readUser(String userId);
    void updateUser(String userId, UserVO newValues);
}

package blah.blammy;
public class UserDTOImpl implements UserDTO
{
  ... implement it based on blammy.
}

package blah.kpow;
public class UserDTOImpl implements UserDTO
{
  ... implement it based on kpow.
}

Пример озвучивания:


public class UserVO
{
    String firstName;
    String lastName;
    String middleInitial;

    ... getters and setters.
}

Я предпочитаю идентифицировать цель удаления с помощью идентификатора, а не объекта VO. Кроме того, возможно, что обновление изменит цель, идентифицированную идентификатором пользователя «smackdown», на идентификатор пользователя «smackup», поэтому я обычно передаю идентификатор и VO.

person DwB    schedule 21.09.2011

Чтобы написать DAO, обычно вы создаете интерфейс, который определяет поведение DAO.

interface MyObjDao {

    public int save(MyObj myObj);

    public void delete (MyObj myObj);

    // as many methods as you need for data acess

}

а затем вы создаете фактическую реализацию

class MyObjDaoImpl implements MyObjDao {
    // implement methods here

}

Преимущества этого:

1) Поскольку вы определяете интерфейс, имитировать DAO легко для любой среды тестирования. 2) Поведение не привязано к реализации — ваш DAOImpl может использовать jdbc, hibernate и т. д.

Ваш класс Persistance действительно является базовым классом для всех сущностей, т. е. всех экземпляров классов, которые сохраняются, где вы хотите представить некоторые общие поля в одном месте. Это хорошая практика - я бы не назвал класс Persistance, лучше что-то вроде BaseEntity (ИМХО). Убедитесь, что у вас есть javadocs, которые объясняют назначение класса.

Что касается имен переменных, пока они имеют смысл и описывают, для чего они предназначены, это хорошо.

так что dateCreated или createdDate оба в порядке; они оба понимают идею.

person hvgotcodes    schedule 21.09.2011

Хорошим подходом было бы использование JPA со всеми его функциями, это руководство было действительно полезным. В нем объясняется, как использовать аннотации @PrePersist и @PreUpdate для установки временных меток создания и обновления. Оптимистическая блокировка поддерживается аннотацией @Version.

person stacker    schedule 21.09.2011

Мои вопросы: как лучше всего написать имя переменной, какое из них хорошее, createdDate или dateCreated, удалено или isDeleted и т. д.

createdDate или dateCreated очень субъективны. Однако в базах данных я в основном видел createdDate. Между удалённым и isDeleted я предпочитаю (опять же субъективно) удалённый. Я думаю, что метод получения можно назвать isDeleted().

person Hari Menon    schedule 21.09.2011