gpt4 book ai didi

java - 每个实体或每个用例的 DAO

转载 作者:行者123 更新时间:2023-11-30 08:58:52 25 4
gpt4 key购买 nike

我有一种情况,我在考虑我应该为每个实体还是每个用例创建一个 DAO。

我有一个表“user”,它存储用户的登录信息。

create table user (user_id varchar(50) not null primary key, password varchar(50))

我有一个表“user_login_history”,它存储了用户登录系统的次数。

create table user_login_history (user_login_history_id int not null identity(1,1) primary key, user_id varchar(50) not null foreign key references user(user_id), login_date datetime not null)

这是用例:对于登录系统的用户,他/她应该通过以下 2 个检查:

  1. 用户 ID 和密码应该在用户表中匹配
  2. 自上次用户登录系统后未超过 30 天。

所以我有一个实体用户

public class User {
private String userId;
private String password;
public String getUserId() { return this.userId; }
public void setUserId(String userId) { this.userId = userId; }
public String getPassword() { return this.password; }
public void setPassword(String password) { this.password = password; }
}

我有一个实体 UserLoginHistory

public class UserLoginHistory {
private int userLoginHistoryId;
private User user;
private java.util.Date loginDate;
public int getUserLoginHistoryId() { return this.userLoginHistoryId; }
public void setUserLoginHistoryId(int userLoginHistoryId) { this.userLoginHistoryId = userLoginHistoryId; }
public User getUser() { return this.user; }
public void setUser(User user) { this.user = user; }
public java.util.Date getLoginDate() { return this.loginDate; }
public void setLoginDate(java.util.Date loginDate) { this.loginDate = loginDate; }
}


所以我想我有两个选择:

1) 通过实体创建 DAO,这意味着 2 个 DAO:

UserDAO 用于 User 实体,它将基于“用户”表和

UserLoginHistoryDAO 用于UserLoginHistory 实体,它将基于“user_login_history”表

public interface UserDAO {
public User getUser(String userId, String password);
}

public interface UserLoginHistoryDAO {
public UserLoginHistory getLastUserLoginHistory(String userId);
}

2) 通过用例创建 DAO,这意味着 1 个 DAO:

LoginDAO,它将包含此用例所需的所有 sql。

public interface LoginDAO {
public User getUser(String userId, String password);
public UserLoginHistory getLastUserLoginHistory(String userId);
}

哪个选择更可取,为什么?

如果我选择选项 1,如果我需要同时使用“user”和“user_login_history”表并从两个表返回列的查询怎么办?在那种情况下,这些类型的查询将在哪个 DAO 中进行? UserDAO 或 UserLoginHistoryDAO 或复合的新 DAO?

谢谢

最佳答案

我建议有第三种选择,您可以保留两个 DAO(访问器和数据库表之间的一对一映射),然后覆盖第三个访问器,这有助于更轻松地操作较低级别的 API。第三个访问器需要另外两个访问器来构造,所以;

public LoginAccess(final UserDAO userAccess, 
final UserLoginHistoryDAO userHistoryAccess)

这种方法的好处在于;

  1. 您可以使访问器的范围尽可能小 - 如果预期仅通过 LoginAccess 使用,用户/用户历史 DAO 实现是否需要public 访问器?
  2. 您可以为此设置创建更多类单元 测试用例。无论如何,所有数据库级别的测试都更多地侧重于集成测试,但是每个基于表的查询有一组测试是很好的,每个函数有一组测试(不用担心正在使用的 SQL)也很好。相反,在一个步骤中检查函数和 SQL 的一组测试本质上更脆弱。
  3. 第三种方法更严格地遵循 SOLID 原则

我认为 1 和 2 是关键 - 通常我发现,如果有一种方法可以编写更有效的单元测试并减少面向公众的 API,那么我会采用这种方法。如果后来我的方法被证明是不合适的(很可能!),我有一个强大的测试套件,我可以在其上积极重构。

关于java - 每个实体或每个用例的 DAO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27475528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com