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 を利用することができます。