Java 如何定义具有可变属性的类?
我正在做一个数据库程序。我希望用户能够定义他们自己的列,任意多。那么,如何在其类文件中定义每个记录?(因为属性在用户之间是不同的)Java 如何定义具有可变属性的类?,java,database,Java,Database,我正在做一个数据库程序。我希望用户能够定义他们自己的列,任意多。那么,如何在其类文件中定义每个记录?(因为属性在用户之间是不同的) 这是学校作业的一部分,老师可以为不同的学生添加不同的分数和类似的内容,但他们也可以添加新作业,测试(列)。如果你想在数据库运行时向数据库添加和删除列,这通常表明你的设计是错误的。您的“列”可能应该对应于单个表中的行。如果您想在数据库运行时向数据库添加和删除列,这通常表明您的设计是错误的。您的“列”可能应该对应于单个表中的行。您需要一些“东西”来根据数据库表生成类
这是学校作业的一部分,老师可以为不同的学生添加不同的分数和类似的内容,但他们也可以添加新作业,测试(列)。如果你想在数据库运行时向数据库添加和删除列,这通常表明你的设计是错误的。您的“列”可能应该对应于单个表中的行。如果您想在数据库运行时向数据库添加和删除列,这通常表明您的设计是错误的。您的“列”可能应该对应于单个表中的行。您需要一些“东西”来根据数据库表生成类 看看 有不同的方法可以做到这一点: 您需要“某种东西”根据数据库表生成类 看看 有不同的方法可以做到这一点:
你其实不需要上课。基本上,在Java世界中,所有类在执行之前都需要编译。因此,基于属性向类动态添加字段不是一个好方法。相反,我建议您使用集合。这可以通过以下方式实现:
List<Map<String,Object>> data;
列表数据;
可以将类似映射的列名作为列值的键和值。密钥可以在属性中配置,数据可以按任意顺序存储。实际上不需要类。基本上,在Java世界中,所有类在执行之前都需要编译。因此,基于属性向类动态添加字段不是一个好方法。相反,我建议您使用集合。这可以通过以下方式实现:
List<Map<String,Object>> data;
列表数据;
可以将类似映射的列名作为列值的键和值。键可以在属性中配置,数据可以按任意顺序存储。您需要这种数据库设计,因此不需要添加新的“列”(类属性)或任何内容:
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语言中的外键)。您需要这种数据库设计,因此不需要添加新的“列”(类属性)或任何内容:
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语言中的外键)。在这种类型的任务中,主要问题是如何存储配置。不需要为每次结构修改创建类 你应该把你的任务分成三部分
A1:如何扩展表格 如果要扩展具有列的表,则应该有一些数据来执行此操作 因此,您应该从用户处获得:
- 表名
- 列名
- 柱型
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);
}
公共类表格行{
私有映射rowData=newhashmap();
公共对象getValue(UserTableColumn列);
公共void setValue(UserTableColumn列,对象值);
}
我希望这个简短的解释能满足你的需要
祝你好运 在这种类型的任务中,主要问题是如何存储配置。不需要为每次结构修改创建类 你应该把你的任务分成三部分
A1:如何扩展表格 如果要扩展具有列的表,则应该有一些数据来执行此操作 因此,您应该从用户处获得:
- 表名
- 列名
- 柱型
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));
有了这样的结构,你就很容易相信了