gpt4 book ai didi

java - Java 中使用 DAO 模式的多对多关系

转载 作者:行者123 更新时间:2023-11-30 21:28:33 24 4
gpt4 key购买 nike

我正在创建一个仅使用 Java 而不是任何框架的 Web 应用程序。

此时我必须从数据库中获取数据。我正在使用 DAO 模式执行此操作,但我无法理解有关关系(一对一、一对多和多对多)的一些逻辑。

为了更好地理解我的问题,我将通过一个确切的例子来解释。

我在数据库中有两个实体(表)UserRole .实体User具有属性 id, name, lastname, username, and password , 和表格 Role具有属性 id, role, description .

从这里我得到了一个 User 的关系可以有多个Role (因此用户既可以是网络应用程序的简单用户,也可以是管理员),以及一个 Role可以在很多User .从这一点开始,我创建了另一个代表多对多关系的表,名为 UserRoles具有属性 user_id, role_id .

现在在 Java 中我有一个名为 `User:

的类
public class User
{
private int id; (with getters and setters)
private String name; (with getters and setters)
private String lastname; (with getters and setters)
private String username; (with getters and setters)
private String password; (with getters and setters)
// and two constructors with and without parameters together with toString method
}

接口(interface)名为UserDAO :

public interface UserDAO
{
public User find(intid);
public User find(String email, String password);
public List<User> users();
public void create(User user);
public void update(User user);
public void delete(User user);
public boolean existEmail(String email);
public void changePassword(User user);
}

我有一个用于使用名为 UserDAOJDBC 的 MySQL 查询进行操作的类:

public class UserDAOJDBC implements UserDAO
{
private static final String FIND_BY_ID = "SELECT * FROM user WHERE id=?";

@Override
public User find(int id) {
return find(FIND_BY_ID, id);
}

private User find(String sql, Object... values){
User user = null;
try {
ResultSet resultSet = DBConnectionPool.executeQuery(sql, values);
if(resultSet.next()){
user = new User();
user.setId(Integer.parseInt(resultSet.getString("id")));
user.setName(resultSet.getString("name"));
user.setLastname(resultSet.getString("lastname"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
}
DBConnectionPool.getConnection().close();
} catch (Exception e) {
System.out.println(e);
}
return user;
}

}

现在我想得到 Role一个User什么是更好的做法?

到目前为止我有这个解决方案:

1) 我必须包括 RoleUser类:

public class User
{
private int id; (with getters and setters)
private String name; (with getters and setters)
private String lastname; (with getters and setters)
private String username; (with getters and setters)
private String password; (with getters and setters)
private List<Role> roles; (with getters and setters)
// and two constructors with and without parameters together with toString method
}

并在类中创建 UserDAOJDBC一个名为 findWithRoles 的方法这使得与表的连接为:

SELECT * FROM user AS u INNER JOIN userroles as ur ON u.id = ur.user_id

然后第二个查询遍历前一个查询的结果:

SELECT * FROM role AS r INNER JOIN userroles as ur ON r.id = ur.role_id

并从此查询的结果集中填充数组 List<Role> roles .

最佳答案

您不需要将 Role 包含到 User 类中(即使您可以)。创建 UserRoles 表并从中读取数据就足够了。您可能应该创建 UserRolesDAO 类,该类将为您实现所有方法,以查找特定用户的所有角色,以及所有用户的特定角色,以及保存新用户、角色组合并读回。

我有an example在 github 上,我使用 JDBC 和 DAO 模式以完全相同的方式组合学生和类(class),所以请随意看一看。

博客 post关于道

关于java - Java 中使用 DAO 模式的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57546479/

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