我在理解如何在javaweb应用程序中表示sql表以及如何处理各种类型的关系时遇到了问题。
假设有一个部门表:
CREATE TABLE IF NOT EXISTS `department` (
`name` varchar(15) NOT NULL,
`number` int(11) NOT NULL,
PRIMARY KEY (`number`),
) ENGINE=InnoDB;
一个部门有很多员工,一个员工只能为一个部门工作,所以部门和员工之间存在1:n的关系。这可以是employees表:
CREATE TABLE IF NOT EXISTS `employee` (
`first_name` varchar(15) NOT NULL,
`last_name` varchar(15) NOT NULL,
`SSN` char(9) NOT NULL,
`address` varchar(30) DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`salary` decimal(10,0) DEFAULT NULL,
`N_D` int(11) NOT NULL,
PRIMARY KEY (`SSN`),
FOREIGN KEY `N_D` REFERENCES `department`(`number`),
) ENGINE=InnoDB;
到目前为止没有问题,但是现在让我们转到java。我的应用程序将有一个dao来读取数据库中选定的元素,可能有两个类称为 DepartmentDAO
以及 EmployeeDAO
. 我的问题是如何正确地表示部门实体和员工实体?我该如何处理这段关系?我见过有人用数组表示1对多关系,用单个对象表示相反的情况:
public class Department{
private String name;
private Long number;
/*1:N*/
private Employee[] employees;
/*getter and setter*/
}
员工类别:
public class Employee{
private String firstName;
private String lastName;
private String SSN;
private String address;
private String gender;
private int salary;
/*N:1*/
private Department department;
/*getter and setter*/
}
看起来没问题,但我如何读取嵌套对象?在employee情况下,我可以在查询中使用join来读取两个对象,但在另一种情况下,我有一个数组。
例如,我想把某个部门的雇员人数形象化。当我读取department对象时,我还应该读取n个employee对象和by employees.length,我可以得到数字。是不是有点太贵了?把另一个属性放在我的系类中是错误的( private int numberOfEmployees;
)并在sql中使用count读取它?
事先谢谢你的帮助。
1条答案
按热度按时间ggazkfy81#
如果我没弄错的话,你想数一数每个部门的员工吗?
如果是这样,我建议使用dao模式。除了dao模式之外,还可以使用键:值列表或类似hashmap的Map。
Map应该包含作为关键的特定部门和作为价值观的员工。
此外,您必须同步数据库和java对象,才能向Map中添加对。
总而言之,您需要创建一个数据管理类,该类包含一个带有键(department)和值(employee)的列表或Map。
此外,它必须能够与数据库进行事务处理以同步数据。
因此,您可以使用dao模式和hashmap,参考如下。
我不知道这是否是一个好的做法,但它将工作。
刀型
散列表
编辑:当我再次阅读您的问题时,hashmap应该在department类中,但是您仍然可以使用dao模式进行同步和数据管理。