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

Posted

技术标签:

【中文标题】Java中使用DAO模式的多对多关系【英文标题】:Many-to-many relationship in Java using DAO pattern 【发布时间】:2019-12-24 01:37:31 【问题描述】:

我正在创建一个仅使用 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

还有名为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);

我有一个用于处理 mysql 查询的类,名为 UserDAOJDBC

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;
    



现在,当我想用​​一个User 获得Role 时,有什么更好的做法?

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

1) 我必须在 User 类中包含 Role

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

并从此查询的 ResultsSet 中填充数组 List&lt;Role&gt; roles

【问题讨论】:

【参考方案1】:

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

我在 github 上有 an example,在那里我使用 JDBC 和 DAO 模式以完全相同的方式将 Student 和 Courses 组合在一起,所以请随意看看。

博客post关于道

【讨论】:

以上是关于Java中使用DAO模式的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

道。多对多关系

Hibernate的多对多关联关系

如何处理mongodb中的多对多关系

GraphQL Apollo 中的多对多关系

用NHibernate处理带属性的多对多关系

更新 Prisma 中的多对多关系