Apache Derbyの取扱い
- 基本情報
- データベース接続設定
- データ型マッピング
- 主キーでの自動採番
- ページング検索の条件
- 更新ロックの取得
- プロシージャ
- データベース依存機能
- DBMS独自の利用方法
- DBMS独自の注意点
- Exampleのススメ
- 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 に関しては、自動マッピング機能が利用可能です。
未サポートのデータ型
- 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()