TypesafeCursor
sql2Entityで自動生成される TypesafeCursor についてのページです。
- TypesafeCursorとは?
- TypesafeCursorの自動生成
- TypesafeCursorマーク
- TypesafeCursorの構造
- TypesafeCursorの使い方
- ValueTypeの調整
TypesafeCursorとは?
外だしsQLのカーソル検索において、Resultsetオブジェクトを直接扱うのではなく、カーソル操作をしながらもタイプセーフにデータにアクセス できるようにするクラスを TypesafeCursor と呼びます。TypesafeCursorはCustomizeEntityと同じくsQLのselect句と同じプロパティ構造(読み取りのみ)を持ちます。
TypesafeCursorの自動生成
TypesafeCursorは、CustomizeEntityと同様にsql2EntityタスクでsQLを実行することで得られるメタデータを元に自動生成されます。 出力先ディレクトリと出力クラスのパッケージは、Generateタスクで自動生成されるクラスと同じで、 Behaviorのパッケージ配下の "cursor" パッケージに出力されます。
CustomizeEntityに加えて(@since 1.0.5A)、TypesafeCursorが自動生成されます。
古いクラスは削除される
外だしsQLのどこにも記述されていない既存の古いTypesafeCursorは(ファイルシステム上から)削除されます。 古いTypesafeCursorを利用しているプログラムはコンパイルエラーとして検知できます。
TypesafeCursorマーク
TypesafeCursorの生成は、CustomizeEntityのオプションとして指定します。CustomizeEntityマーク を記述した上で、別途sQLの行コメントで +cursor+ という形で指定します。これを "TypesafeCursorマーク" と呼びます。
e.g. simpleMemberという名前のTypesafeCursorを生成 @sQL-File
-- #df:entity#
-- +cursor+
select ...
from ...
TypesafeCursorの名前の指定は、CustomizeEntityマークで指定されたものが利用されます。 直接クラス名を記述することもできますし、sQLファイル名から導出することもできます。
※EMechaで作成するときは、"Use Cursor" にチェックを付ければOKです。
TypesafeCursorの構造
ResultsetのラッパであるCursorクラス と それをコールバックで扱うCursorHandlerクラス の2つが存在します。それぞれ、ジェネレーションギャップになっています。
Cursorクラス
Resultsetを保持し、"Resultsetに対する(カラムの)文字列アクセスを代理するメソッド" が存在します。
- next()
- 次のレコードへ
- getXxx()
- カラムデータの取得 (タイプセーフ)
- cursor()
- 保持しているResultsetの取得 (通常利用しない)
CursorHandlerクラス
CursorHandlerインターフェースを実装しており、Cursorクラスを業務的に扱う処理を実装して、 Behavior(Ousidesql)に渡してその処理をコールバックしてもらいます。生成されるクラス自体は abstractクラス であり、 fetchCursor()メソッドをオーバーライドしたクラスを定義して利用します。
- fetchCursor()
- Cursorクラスを業務的に扱う処理 (abstractメソッド)
TypesafeCursorの使い方
CursorHandlerクラスの fetchCursor() メソッド をオーバーライドしたクラスを定義し、そのクラスのインスタンスを 外だしsQLの selectCursor() メソッド の引数に指定します。fetchCursor() では、Cursorクラスを参照して業務処理を実装します。
ValueTypeの調整
デフォルトでは、マッピングされたプログラム型に対応する ValueType が利用されるため、基本的には意識する必要はありませんが、万が一、別の ValutType を利用したい場合は、TypesafeCursor のExクラスにて、get メソッドをオーバーライドすることで、独自の ValutType を利用することができます。