【发布时间】: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。
【问题讨论】:
标签: java mysql many-to-many one-to-many dao