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:如何扩展表格

    如果要扩展具有列的表,则应该有一些数据来执行此操作

    因此,您应该从用户处获得:

    • 表名
    • 列名
    • 柱型
    有了这些数据,您可以轻松地创建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);
    
    }
    
    公共类表格行{
    私有映射rowData=newhashmap();
    公共对象getValue(UserTableColumn列);
    公共void setValue(UserTableColumn列,对象值);
    }
    
    我希望这个简短的解释能满足你的需要


    祝你好运

    在这种类型的任务中,主要问题是如何存储配置。不需要为每次结构修改创建类

    你应该把你的任务分成三部分

  • 如何扩展表定义
  • 如何对这样的表运行查询
  • 如何显示查询结果的结果
    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));
    
    有了这样的结构,你就很容易相信了