データベースプログラムを作っています。ユーザーが自分の列を好きなだけ定義できるようにしたい。クラスファイルで各レコードをどのように定義しますか?(プロパティはユーザーごとに異なるため)
これは学校の課題の一部です。教師が追加できるさまざまな生徒のさまざまなスコアなどを保持しますが、新しい課題 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
sを使用して Java クラス設計に変換できるはずですMap
。
これは宿題なので、Javaコードではなく、特にDB設計(「疑似コード」)を提供しています。
参考までに: REF は参照 (DB 言語の外部キー) の略です。
データベースの実行中に列を追加および削除する場合、通常は設計が間違っていることを示しています。あなたの「列」は、おそらく単一のテーブルの行に対応しているはずです。
実際にはクラスは必要ありません。基本的に、Java の世界では、すべてのクラスを実行する前にコンパイルする必要があります。そのため、プロパティに基づいてクラスにフィールドを動的に追加することは、適切なアプローチではありません。むしろ、コレクションを使用することをお勧めします。これは次のように実現できます。
List<Map<String,Object>> data;
列の値のキーと値としてマップのような列名を持つことができます。キーはプロパティで構成でき、データは任意の順序で保存できます。
データベーステーブルに対してクラスを生成する「何か」が必要です。
休止状態を見てください
それにはさまざまな方法があります。
http://www.hibernate.org/subprojects/tools.html
http://www.wikihow.com/Generate-Hibernate-Pojo-Classes-from-DB-Tables
このタイプのタスクでの主な問題は、構成を保存する方法です。構造変更ごとにクラスを作成する必要はありません。
タスクを 3 つに分割する必要があります。
A1: テーブルを拡張するには?
列を使用してテーブルを拡張する場合は、そのためのデータが必要です。
したがって、ユーザーから取得する必要があります。
これらのデータがあれば、列を追加する ALTER ステートメントを簡単に作成できます。
A2: 動的テーブルでクエリを実行する方法は?
ここでは、巧妙または通常の 2 つのオプションがあります。
これらのデータをどのように取得するかはあなた次第です。重要なのは、それらをアプリケーションにどのように保存するかです。テーブルをマップするオブジェクトを作成することをお勧めします。
結果セット
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);
}
この短い説明があなたのニーズを満たすことを願っています。
幸運を !