繁体   English   中英

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

[英]Many-to-many relationship in Java using DAO pattern

我仅使用 Java 而不是任何框架来创建 Web 应用程序。

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

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

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

由此我有一个关系,一个User可以拥有多个Role (因此一个用户可以是一个简单的用户和 web 应用程序的管理员),并且一个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);
}

我有一个用于操作名为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;
    }

}

现在,当我想为一个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类中UserDAOJDBC一个名为findWithRoles的方法,该方法使与表的UserDAOJDBC为:

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<Role> roles

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

我在 github 上有一个示例,我使用 JDBC 和 DAO 模式以完全相同的方式将学生和课程组合在一起,因此请随意查看。

博客帖子大约DAO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM