dbMeta
dbMetaとは?
Entityごとのdbのメタデータを保持するオブジェクトです。でーびーめた と呼びます。
Entityと同様に テーブル対応のdbMeta と SQL対応のdbMeta と分けることができます。
- テーブル対応のdbMeta
- DomaindbMeta
- SQL対応のdbMeta
- CustomizedbMeta
省略表記
dbm (でーびーえむ)と略して表現されることがあります。主にクラス名などで利用されます。
自動生成される
Entityと同様に(同様のタイミングで)自動生成されます。但し、dbMetaのアプリ独自の拡張は許されていないため、ジェネレーションギャップにはなっていません。
dbMetaのクラス名
[Entityの名前] + dbm という形式です。例えば、MEMBER なら Memberdbm。
基本的にはdbFlute内部用
基本的にはdbFlute内部用のクラスですが、幾つかのdbFluteの機能、または、アプリでメタ情報が必要になったときに利用します。 テーブル情報やカラム情報などの基本的なメタ情報以外のマイナーなメソッドに関しては、互換性が保たれない可能性があるのでご注意下さい。
dbMetaの利用
dbMetaは、全てシングルトンパターンで実装されています。
e.g. 会員のdbMetaインスタンスを取得 @Java
Memberdbm dbm = Memberdbm.getInstance();
List<ColumnInfo> columnInfoList = dbm.getColumnInfoList();
抽象的なレイヤ (e.g. CallbackContext) で利用する場合は、dbMetaインターフェースで取り扱います。
e.g. BehaviorCommandHookのmetaよりdbMetaインスタンスを取得 @Java
public void hookBefore(BehaviorCommandMeta meta) {
dbMeta dbmeta = meta.getdbMeta();
List<ColumnInfo> columnInfoList = dbmeta.getColumnInfoList();
}
テーブル情報 (dbMeta)
ひとつの dbMeta インスタンスが、ひとつのテーブルのメタデータを表現します。 ゆえに、dbMetaから対応するテーブル情報を取得することができます。
テーブル名など基本情報
dbMetaから、テーブル名などの基本的な情報を取得することができます。
- String getTabledbName()
- db上で扱われている(そのままの)テーブル名
- String getTableDispName()
- ドキュメント上で表示されるテーブル名
- String getTablePropertyName()
- プログラム側で利用されるテーブルのプロパティ名
- String getTableSqlName()
- SQLを発行するために最適化されているテーブル名。状況によってスキーマ名が付与されたり、クォートされたりする。主に Behavior や ConditionBean で自動で組み立てられるSQLで利用される。
- String getTableAlias()
- テーブルの(主にローカル言語による)別名。オプションで利用できるようになる。
- String getTableComment()
- テーブルのコメント。オプションで利用できるようになる。
テーブルのカラムを扱う
dbMetaから、カラム情報を判定したり取得したりすることができます。
- boolean hasColumn(String columnFlexibleName)
- 指定されたカラム名の文字列で、カラムが存在するかどうか判定
- ColumnInfo findColumnInfo(String columnFlexibleName)
- 指定されたカラム名の文字列で、該当するカラム情報を取得
- List<ColumnInfo> getColumnInfoList()
- 指定されたカラム名の文字列で、該当するカラム情報を取得
テーブルの主キーを扱う (PrimaryInfo)
テーブルのユニーク制約を扱う (UniqueInfo)
テーブルのリレーションシップを扱う (RelationInfo)
カラム情報 (ColumnInfo)
一つのカラムを表現するクラスが ColumnInfo です。
カラム情報の取得
特定のカラムを意識して取得することもできますし...
e.g. 会員テーブルの会員名称カラムのカラム情報を取得 @Java
Memberdbm dbm = Memberdbm.getInstance();
ColumnInfo memberNameInfo = dbm.columnMemberName(); // for MEMBER_NAME column
String columndbName = memberNameInfo.getColumndbName(); // is "MEMBER_NAME"
...
抽象的に取得することもできます。
e.g. dbMetaインスタンスよりカラムの一覧を取得 @Java
dbMeta dbmeta = meta.getdbMeta();
List<ColumnInfo> columnInfoList = dbmeta.getColumnInfoList();
for (ColumnInfo col : columnInfoList) {
String columndbName = col.getColumndbName();
...
}
EntityのカラムデータをREAD/WRITEする
ColumnInfoを使って、抽象的にEntityからカラムのデータをREAD/WRITEできます。
- <PROPERTY> PROPERTY read(Entity entity)
- 引数で指定されたEntityインスタンスから、該当カラムのデータをgetする
- void write(Entity entity, Object value)
- 引数で指定されたEntityインスタンスに、引数で指定したデータを該当カラムにsetする
e.g. カラムデータの抽象的なREAD/WRITEを見せるための意味のないコード @Java
Entity entity = ... // 例えば、new Member() とか
dbMeta dbmeta = entity.asdbMeta(); // Entity から直接 dbMeta も取得できる
List<ColumnInfo> columnInfoList = dbmeta.getColumnInfoList();
for (ColumnInfo col : columnInfoList) {
Object value = col.read(entity); // getterメソッドを呼び出している
col.write(entity, value); // setterメソッドを呼び出している
...
}
抽象的なBehaviorと連携
dbMetaと抽象的なBehaviorを使うことで、検索や更新処理を抽象的に実行することもできます。
DIコンポーネントである "BehaviorSelectorインターフェース" から、指定されたテーブルに該当する "Behaviorインスタンス" を、"BehaviorReadableインターフェース" として取得できます。
TODO jflute now writing