DBMeta

DBMetaとは?

EntityごとのDBのメタデータを保持するオブジェクトです。でーびーめた と呼びます。

Entityと同様に テーブル対応のDBMetaSQL対応の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