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