Java中使用DAO模式的多对多关系
Posted
技术标签:
【中文标题】Java中使用DAO模式的多对多关系【英文标题】:Many-to-many relationship in Java using DAO pattern 【发布时间】:2019-12-24 01:37:31 【问题描述】:我正在创建一个仅使用 Java 而不是任何框架的 Web 应用程序。
我现在必须从数据库中获取数据。我正在使用 DAO 模式执行此操作,但我无法理解有关关系(一对一、一对多和多对多)的一些逻辑。
为了更好地理解我的问题,我将通过一个确切的例子来解释。
我在数据库User
和Role
中有两个实体(表)。实体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<Role> roles
。
【问题讨论】:
【参考方案1】:您不需要将 Role 包含到 User 类中(即使您可以)。创建 UserRoles 表并从中读取数据就足够了。您可能应该创建 UserRolesDAO 类,该类将为您实现所有方法,以查找特定用户的所有角色,以及特定角色的所有用户,以及保存新用户、角色组合并回读。
我在 github 上有 an example,在那里我使用 JDBC 和 DAO 模式以完全相同的方式将 Student 和 Courses 组合在一起,所以请随意看看。
博客post关于道
【讨论】:
以上是关于Java中使用DAO模式的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章