编写数据访问对象 (DAO) 的最佳方法是啥?

Posted

技术标签:

【中文标题】编写数据访问对象 (DAO) 的最佳方法是啥?【英文标题】: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 等。

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

【问题讨论】:

【参考方案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()。

【讨论】:

以上是关于编写数据访问对象 (DAO) 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在java中存储sql查询的最佳方法是啥

DAO是啥啊?谁能帮忙解释一下??

在 GAE、Java、JDO 等环境中,DAO 是啥?

在通用 DAO 中使用 Hibernate 调用存储过程的最佳方法是啥?

为 ASP.NET 编写月份和年份下拉列表的最佳方法是啥?

javaWeb_JDBC_dao模式设计