编写数据访问对象 (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。
关于变量名,只要它们有意义并描述它们的用途,就很好。
所以dateCreated
或createdDate
都可以;他们都明白了这个想法。
【讨论】:
【参考方案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) 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章