H2 Databaseの取扱い

基本情報

対応バージョン
H2 1.0.x 以上
JDBCドライバの同梱
あり
(同梱)JDBCドライバ
h2-1.2.x.jar

JDBCドライバは随時(そのときの最新バージョンに)アップグレードしていきます。

データベース接続設定

データベース接続設定(databaseInfoMap.dfprop)について。

データベース接続設定の仕様 (Embeddedの場合) @databaseInfoMap.dfprop
map:{
    ; driver   = org.h2.Driver
    ; url      = jdbc:h2:file:../src/main/resources/[...]/[dbname]
    ; schema   = [SCHEMA]
    ; user     = [dbuser]
    ; password = [dbpassword]
}
  • catalog はそもそも対応する概念がないため設定不要
  • schema は独自のスキーマを利用しない限りは PUBLIC と指定
  • [xxx]の[]は単なる表現上(ドキュメント上)の囲み

以下、実際のExampleプロジェクトでの設定例です。

e.g. dbflute-spring-exampleの場合 {dbname=exampledb,schema=PUBLIC} @databaseInfoMap.dfprop
map:{
    ; driver   = org.h2.Driver
    ; url      = jdbc:h2:file:../src/main/resources/exampledb/exampledb
    ; schema   = PUBLIC
    ; user     = sa
    ; password = 
}

データ型マッピング

データベース上のデータ型とプログラム型との(デフォルトの)マッピングについて。

java.lang.String
CHAR, VARCHAR, CLOB, TEXT
java.lang.Integer
INT, TINYINT, SMALLINT, {NUMERIC(1-9, 0)}
java.lang.Long
BIGINT, IDENTITY, {NUMERIC(10-18, 0)}
java.math.BigDecimal
DOUBLE, REAL, NUMERIC(n, m)
java.util.Date
DATE
java.sql.Time
TIME
java.sql.Timestamp
TIMESTAMP
java.lang.Boolean
BOOL
byte[]
BLOB, BINARY

自動マッピング

NUMERIC に関しては、自動マッピング機能が利用可能です。

現場フィット - TypeMapping-AutoMapping

未サポートのデータ型

VARCHAR(_IGNORE_CASE)
どうやって利用する?...*未検証
UUID
byte[]にマッピングされるが...*未検証
ARRAY
一応普通の文字列としてin、outはできるが...*未検証
OTHER
一応16進数の文字列としてin, outはできるが...*未検証

主キーでの自動採番

自動採番(連番)の仕組みとして シーケンスIdentity のどちらかを利用します。

Identity情報はメタデータから取得できるので、設定なしで利用可能です。

ページング検索の条件

limitoffset を利用します。

ConditionBeanのPaging

e.g. ConditionBeanでページング検索 {81-100} @DisplaySql
...
 order by ...
 limit 20 offset 80

OutsideSqlのManualPaging

e.g. OutsideSqlのManualPagingでページング検索 {81-100} @OutsideSql
/*IF pmb.isPaging()*/
select ...
-- ELSE select count(*)
/*END*/
  from ...
 where ...
 /*IF pmb.isPaging()*/
 order by ...
 limit /*$pmb.fetchSize*/20 offset /*$pmb.pageStartIndex*/80
 /*END*/
  • offset や limit ではバインド変数が利用できないので、埋め込み変数("$" を付与)を利用すること

TypedParameterBean における ManualPaging の自動判別ロジックは、"limit" かつ "offset" という文字列が含まれること、もしくは、"limit" かつ "pmb.fetchSize" という文字列が含まれることです。 ("pmb.fetchSize" だけは大文字小文字は区別し、他は区別せず)

更新ロックの取得

ConditionBean の lockForUpdate() では、for update を利用します。

e.g. ConditionBeanで更新ロックの取得 (cb.lockForUpdate()) @DisplaySql
select ...
  from MEMBER dfloc
 where ...
   and ...
 for update

プロシージャ

H2 Databaseのストアドプロシージャに関する全てが 未検証 です。

データベース依存機能

データベース依存機能を有効にした場合の利用可能な機能について。

H2 Databaseに関しては特になし

DBMS独自の利用方法

別スキーマの利用

別スキーマのテーブルを自動生成でき...*未検証

Exampleのススメ

H2 Database を使ったExample実装 dbflute-spring-example があります。

H2 Database補足資料

Identity設定

e.g. Identity設定 {MEMBERのMEMBER_IDにIdentity} @DDL
create table MEMBER (
    MEMBER_ID INTEGER IDENTITY NOT NULL PRIMARY KEY,
    MEMBER_NAME VARCHAR(200) NOT NULL,
    ...
) ;

発行された連番を insert 実行後に取得

e.g. 発行された連番を insert 実行後に取得 @SQL
CALL IDENTITY()