This is a cache of http://dbflute.seasar.org/ja/manual/function/generator/task/sql2entity/typesafecursor.html. It is a snapshot of the page at 2024-11-13T00:20:53.268+0000.
Type<strong>s</strong>afeCur<strong>s</strong>or | DBFlute

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