[英]Many-to-many relationship in Java using DAO pattern
我仅使用 Java 而不是任何框架来创建 Web 应用程序。
我现在必须从数据库中获取数据。 我正在使用 DAO 模式执行此操作,但是我在理解有关关系(一对一、一对多和多对多)的一些逻辑时遇到了问题。
为了更好地理解我的问题,我将举一个确切的例子来解释。
我在数据库User
和Role
有两个实体(表)。 实体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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.