batchInsert(entityList)

概要

基本概念

Entityのリストをもとに バッチ登録 をします。

これは単なる複数件の insert() ではありません。 DBと一回の通信で複数件のレコードを取扱うバッチ更新により、ループで一件登録を行う場合に比べてパフォーマンス的に優位です。 具体的には、PreparedStatement の addBatch(), executeBatch() を利用します。

DBアクセス - バッチ更新

通常の一件登録の insert() とは違う仕様を持つことがあります。例えば、登録時に自動採番された Identity の値は登録後の Entity の中には格納されません。また、insert 文に列挙されるカラムは複数のEntityでの最小公倍数のカラムです(@since 1.0.5A)

会話上では、ばっちいんさーと と表現します。

実装方法

実装の流れ

Behaviorの batchInsert() を呼び出し、Entityを指定します。

e.g. insert()の実装手順 (Eclipseでコード補完) {MEMBER} @Java
List<Member> memberList = new ArrayList<Member>();
{
    Member member = new Member();
    //member.setMemberId(1); // 自動採番の場合は不要
    member.setMemberName("Stojkovic");
    ...
    //member.setRegisterUser(user); // 共通カラムは自動設定(設定が有効なら)
    //member.setRegister...
    //member.setVersionNo(versionNo); // バージョン番号は自動で初期値に
    memberList.add(member);
}
{
    Member member = new Member();
    member.setMemberName("Savicevic");
    ...
    memberList.add(member);
}
{
    Member member = new Member();
    member.setMemberName("Mijatovic");
    ...
    memberList.add(member);
}

memberBhv.baI // .baI と打って enter
--
memberBhv.batchInsert(memberList);

// .ba と打つと batchInsert() や batchUpdate() など
// バッチ更新系のメソッドだけが補完候補に列挙される

メソッド仕様

引数

該当のBehaviorに対応するテーブルのEntityのリストとなります。

空リストの場合は、何も処理が発生しません。nullを指定した場合は例外発生します。

戻り値

それぞれのレコードごとの登録件数を示す int[] です。これは JDBC の executeBatch() の戻り値そのままの値となっています。一つの Entity で一つのレコードを登録する仕様なので、実際には {1, 1, 1, 1, ...} という値になることが想定されます。"0" を持つ要素は登録に失敗したことを示しますが、そのような状況は想定されていません。 (ほとんどの場合において、この戻り値を意識する必要はないでしょう)

例外

一意制約違反があった場合
org.seasar.dbflute.exception.EntityAlreadyExistsException
DBFluteで正式サポートしていない DBMS では、別の例外(SQLFailureException)の可能性があります。

自動採番処理の自動化

一件登録の insert() と同じく自動設定されます(全ての Entity にそれぞれ設定されます)。

ただし、バッチ登録特有の制限として、Identityの場合は採番された値を登録処理後の Entity から取得することができません。 (シーケンスの場合は取得できる)

共通カラムは自動設定

一件登録の insert() と同じく自動設定されます(全ての Entity にそれぞれ設定されます)。

排他制御カラムの自動設定

一件登録の insert() と同じく自動設定されます(全ての Entity にそれぞれ設定されます)。

カスケードはしません

一件登録の insert() と同じくカスケードはしません。

insert文に列挙されるカラム

Setterが呼ばれたカラムが登録される @since 1.0.5A

(newされた) Entity の Setter が呼ばれたカラムが、insert 文の項目に列挙されます(@since 1.0.5A)。 これを ModifedOnly と呼び、一件登録の insert() の方と同じ方式です。

ただ、複数のEntityで呼び出しセットがバラバラな場合は、最小公倍数のカラムが列挙されます。 ゆえに、一部のEntityで呼び出されなかったカラムの登録では、デフォルト制約が利用されず、固定でnullで登録されます(nullでセットすることを省略したとみなされる)。 もちろん、最小公倍数に含まれなかったカラムは、デフォルト制約が有効です。

※自動採番のPKや共通カラムや排他制御カラムは、Setterが呼ばれなくても特別な処理で列挙されます。

1.0.5Aより前のバージョンでは

insert 文の項目には全てのカラムが列挙されます。 ゆえに、DB上ので設定でデフォルト制約が存在する場合でも、そのデフォルト値を利用して登録することはできません。

運用後のDB変更でNotNullのカラム追加をする際は、そのテーブルのBehaviorの batchInsert() の呼び出し処理を確認する必要があります。そのまま何も対応せずカラムだけ追加すると、NotNull制約で落ちる可能性があります。 例えば Eclipse であれば、ctrl + shift + G のショートカットで呼び出し階層を検索できます。

以前の悩みがこちらです。(ようやく改善しました)

更新系、列挙されるカラムのまとめ

まとめていますので、ぜひご覧を。