【问题标题】:What is the best approach to write a data access object (DAO)?编写数据访问对象 (DAO) 的最佳方法是什么?
【发布时间】:2011-11-22 04:12:45
【问题描述】:

我试图用 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,deleted 或 isDeleted 等。

这种方法是好的还是有更好的方法? 以及如何实现数据版本控制?

【问题讨论】:

    标签: java coding-style dao convention


    【解决方案1】:

    要编写 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。

    关于变量名,只要它们有意义并描述它们的用途,就很好。

    所以dateCreatedcreatedDate 都可以;他们都明白了这个想法。

    【讨论】:

      【解决方案2】:

      您在同一个类中混合了 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.
      }

      语音示例:

      
      public class UserVO
      {
          String firstName;
          String lastName;
          String middleInitial;
      
          ... getters and setters.
      }

      我更喜欢使用 ID 而不是 VO 对象来识别删除的目标。此外,更新可能会将用户 ID“smackdown”标识的目标更改为用户 ID“smackup”,因此我通常会传递一个 id 和一个 VO。

      【讨论】:

        【解决方案3】:

        一个好的方法是使用 JPA 及其所有功能,这个tutorial 真的很有帮助。 它解释了如何使用 @PrePersist 和 @PreUpdate 注释来设置创建和更新时间戳。 @Version 注解支持乐观锁定。

        【讨论】:

          【解决方案4】:

          我的问题是 - 编写变量名的最佳方式是什么? 一个是好的,createdDate 或 dateCreated,deleted 或 isDeleted 等。

          createdDate 或 dateCreated 是非常主观的。在数据库中,我主要看到 createdDate。在deleted 和isDeleted 之间,我更喜欢(再次主观地)deleted。我认为getter方法可以命名为isDeleted()。

          【讨论】:

            猜你喜欢
            • 2011-04-26
            • 2012-10-23
            • 1970-01-01
            • 2015-01-30
            • 1970-01-01
            • 2010-11-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多