Apache Derbyの取扱い

基本情報

対応バージョン
Derby 10.5.x 以上
JDBCドライバの同梱
なし
(推奨)JDBCドライバ
derby.jar (+ derbyclient.jar) (Exampleで利用)

クライアントサーバ環境では derby.jar の他に derbyclient.jar が必要となります。

データベース接続設定

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

データベース接続設定の仕様 (Embedded環境の場合) @databaseInfoMap.dfprop
map:{
    ; driver   = org.apache.derby.jdbc.EmbeddedDriver
    ; url      = jdbc:derby:../src/main/resources/[dbname];create=true
    ; schema   = [SCHEMA]
    ; user     = [dbuser]
    ; password = [dbpassword]
}
  • catalog はそもそも対応する概念がないため設定不要
  • schema は大文字で指定
  • [xxx]の[]は単なる表現上(ドキュメント上)の囲み
  • クライアントサーバ環境では driver は "org.apache.derby.jdbc.ClientDriver" と指定し、url は "jdbc:derby://[host]:[port]/[databaseName];[URLAttributes]" となります。

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

e.g. dbflute-multipledb-spring-exampleの場合 (Embedded環境の場合) @databaseInfoMap.dfprop
map:{
    ; driver   = org.apache.derby.jdbc.EmbeddedDriver
    ; url      = jdbc:derby:../src/main/resources/librarydb;create=true
    ; schema   = LIBRARYDB
    ; user     = librarydb
    ; password = librarydb
}

データ型マッピング

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

java.lang.Boolean
なし
java.lang.String
CHAR, VARCHAR, CLOB, LONG VARCHAR
java.lang.Integer
INTEGER, SMALLINT, {DECIMAL(1-9, 0)}
java.lang.Long
BIGINT, {DECIMAL(10-18, 0)}
java.math.BigDecimal
DECIMAL(n, m), DOUBLE, REAL
java.util.Date
DATE
java.sql.Time
TIME
java.sql.Timestamp
TIMESTAMP
byte[]
BLOB

自動マッピング

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

現場フィット - TypeMapping-AutoMapping

未サポートのデータ型

CHAR FOR BIT DATA
byte[]にマッピングされるが...*未検証
VARCHAR FOR BIT DATA
byte[]にマッピングされるが...*未検証
XML
利用不可 (例外発生: 文字列型では扱えない!?)

主キーでの自動採番

自動採番(連番)の仕組みとして Identity を利用します。

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

ページング検索の条件

offset n rows fetch first m rows only を利用します。

ConditionBeanのPaging

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

OutsideSqlのManualPaging

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

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

更新ロックの取得

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

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

プロシージャ

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

データベース依存機能

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

Derbyに関しては特になし

DBMS独自の利用方法

別スキーマの利用

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

DBMS独自の注意点

NullsFirst/Last

nulls first/last 構文をサポートしていないため、case when 構文を使って NullsFirst/Last を実現しています。union 句での case when 構文がサポートされないため、UnionQuery と NullsFirst/Last を合わせてることはできません。 (また、パフォーマンス上の懸念が多少あるので、大量データのときには注意して下さい)

Exampleのススメ

Apache Derby を使ったExample実装 dbflute-multipledb-spring-example があります。

Apache Derby補足資料

Identity設定

e.g. Identity設定 {MEMBER_IDにIdentity(by default)} @DDL
create table MEMBER (
    MEMBER_ID int generated by default as identity NOT NULL PRIMARY KEY,
    MEMBER_NAME VARCHAR(200),
    ...
)
e.g. Identity設定 {MEMBER_IDにIdentity(always)} @DDL
create table MEMBER (
    MEMBER_ID int generated by always as identity NOT NULL PRIMARY KEY,
    MEMBER_NAME VARCHAR(200),
    ...
)

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

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