Каков наилучший подход для написания объекта доступа к данным (DAO)? - PullRequest
4 голосов
/ 21 сентября 2011

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

  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

 }

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

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

Ответы [ 4 ]

3 голосов
/ 21 сентября 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 оба в порядке; они оба передают идею.

2 голосов
/ 22 сентября 2011

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

2 голосов
/ 21 сентября 2011

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

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

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.
}

Пример VO:


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

    ... getters and setters.
}

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

0 голосов
/ 21 сентября 2011

Мои вопросы: как лучше всего написать имя переменной, какой из них хороший, созданDate или dateCreated, удален или isDeleted и т. Д.Хотя в базах данных я в основном видел madeDate.Между удаленным и isDeleted я предпочитаю (опять же субъективно) удаленный.Я думаю, что метод получения может быть назван isDeleted ().

...