我正在制作一个数据库程序。我希望用户能够根据需要定义自己的列。然后我将如何在其类文件中定义每条记录?(因为属性会因用户而异)
它是学校作业的一部分——它将为教师为他们可以添加的不同学生保存不同的分数和喜欢的东西,但他们也可以添加新的作业 test(a column) 。
您需要这种数据库设计,因此您不需要添加新的“列”(类属性)或任何东西:
TEACHERS (Class called Teacher)
________
TeacherId
Name
STUDENTS (Class called Student)
________
StudentId
Name
ASSIGNMENTS (Class called Assignment)
___________
AssignmentId
TeacherId (REF)
Name
GRADES (Class called Grade)
______
AssignmentId (REF)
StudentId (REF)
Grade
您应该能够使用Map
s 转换为 Java 类设计。
我专门给出 DB 设计(“伪代码”)而不是 Java 代码,因为这是家庭作业。
仅供参考:REF 代表参考(DB 语言中的外键)。
如果您想在数据库运行时添加和删除列,这通常表明您的设计是错误的。您的“列”可能应该对应于单个表中的行。
你实际上不需要上课。基本上,在 Java 世界中,所有类都需要在执行之前进行编译。因此,基于属性向类动态添加字段并不是一个好方法。相反,我建议您使用集合。这可以像这样实现:
List<Map<String,Object>> data;
您可以将 Map like 列名作为列值的键和值。可以在属性中配置键,并且可以以任何顺序存储数据。
在这种类型的任务中,主要问题是如何存储配置。您不需要为每个结构修改创建一个类。
你应该把你的任务分成三个。
A1:如何扩展表格?
如果你想用列扩展一个表,你应该有一些数据来做到这一点。
所以你应该从用户那里得到:
有了这些数据,您可以轻松地创建一个 ALTER 语句来添加列。
A2:如何对动态表执行查询?
我们在这里有两个选择,聪明的或正常的。
如何检索这些数据取决于您,重要的是如何将它们存储在您的应用程序中。我建议您创建一些将映射表的对象。
结果集
TABLE_A | COLUMN_1 | String
TABLE_A | COLUMN_2 | Integer
TABLE_A | COLUMN_3 | Boolean
简化代码
UserTable userTable = new UserTable("TABLE_A");
userTable.addColumn(new UserTableColumn("COLUMN_1",String.class));
userTable.addColumn(new UserTableColumn("COLUMN_2",Integer.class));
userTable.addColumn(new UserTableColumn("COLUMN_3",Boolean.class));
拥有这样的结构,您可以轻松地创建针对此类表的查询。
A3:如何操作动态表中的数据?
这是棘手的部分。有多种方法可以做到这一点。不太复杂的是创建一个具有键值结构的对象。其中 key 是列名,value 是值。重要的是定义主键,即允许您以简单的方式确定这是新行的标识符,因此您应该插入它或只需要更新的旧行。
public class TableRow {
private Map<UserTableColumn,Object> rowData = new HashMap<UserTableColumn,Object>();
public Object getValue(UserTableColumn column);
public void setValue(UserTableColumn column, Object value);
}
我希望这个简短的解释能满足您的需求。
祝你好运 !
您需要针对您的数据库表生成类的“东西”。
看看休眠
有不同的方法可以做到这一点:
http://www.hibernate.org/subprojects/tools.html
http://www.wikihow.com/Generate-Hibernate-Pojo-Classes-from-DB-Tables