TypeSafeCursor

Sql2Entityで自動生成される TypeSafeCursor についてのページです。

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クラスを参照して業務処理を実装します。

外だしSQL - selectCursor()

ValueTypeの調整

デフォルトでは、マッピングされたプログラム型に対応する ValueType が利用されるため、基本的には意識する必要はありませんが、万が一、別の ValutType を利用したい場合は、TypeSafeCursor のExクラスにて、get メソッドをオーバーライドすることで、独自の ValutType を利用することができます。