## パッケージ nga.sql

SQL文だけで O-R マッピングを行なう超シンプルなパーシステンスライブラリ。

参照先:
説明

インタフェースの概要
Caller: ストアドプロシージャ・ストアドファンクション実行用 SQL オブジェクト。
Selecter<R>: Select 文用 SQL オブジェクト。
Updater: Update / Insert / Delete 用 SQL オブジェクト。

クラスの概要
SQL: SQL オブジェクト作成用ファクトリクラス。

例外の概要
DuplicatedException: 重複登録や整合性制約違反時に発生する例外。

## パッケージ nga.sql の説明

SQL文だけで O-R マッピングを行なう超シンプルなパーシステンスライブラリ。

こんな人におすすめです。

- SQL文は書きたいけれど，Statement の setXXX メソッドや，ResultSet の getXXX メソッドをいちいち書くのは面倒だと思っている人。
- SQL文を書くのは苦にならないけど，設定ファイルでいちいちマッピング設定するのは面倒くさい，と思っている人。

### SELECT の使用例

SELECT は `SQL.createSelecter` メソッドで取得した，`Selecter` の `find` メソッドを呼び出して実行する。

        // 検索を実行して，リストに格納する。
        List<Item> itemList =
            SQL.createSelecter(
                connection,                 // データベースコネクション
                Item.class,                 // 検索結果格納クラス
                "SELECT"+
                " ITEM_CD AS code, ITEM_NM AS name"+
                " FROM ITEM"+
                " WHERE ITEM_NM = @0@"+
                "    OR ITEM_CD = @1@",     // SQL
                "apple","2"                 // パラメタ
            ).find();

        // 検索結果を出力する。
        for(Item item : itemList) {
            System.out.format("%s, %s%n", item.getCode(), item.getName());
        }

select する列を Value オブジェクトにマッピングするためには「AS プロパティ名」というふうに別名で select を行なう。

検索条件は，@0@, @1@, @2@ ... で渡すことができる。
あるいは，Value オブジェクトに格納されたプロパティを検索条件として渡すことも可能。この場合は，下記のように @code@, @name@ ... と記述する。

        // Value オブジェクトにパラメタ設定を行なう。
        Item parameter = new Item();
        parameter.setName("apple");
        parameter.setCode("2");

        // 検索を実行して，リストに格納する。
        List<Item> itemList =
            SQL.createSelecter(
                connection,                 // データベースコネクション
                Item.class,                 // 検索結果格納クラス
                "SELECT"+
                " ITEM_CD AS code, ITEM_NM AS name"+
                " FROM ITEM"+
                " WHERE ITEM_NM = @name@"+
                "    OR ITEM_CD = @code@",  // SQL
                parameter                   // パラメタ
            ).find();

        // 検索結果を出力する。
        for(Item item : itemList) {
            System.out.format("%s, %s%n", item.getCode(), item.getName());
        }

### LIKE の使用

LIKE を使って前方一致検索等を実行したい場合は，@...@ の中に % 記号を書く。
例えば，`ITEM_CD LIKE @code%@` とすれば，前方一致検索，`ITEM_CD LIKE @%code@` とすれば後方一致検索となる。

### INSERT / UPDATE / DELETE の使用例

INSERT / UPDATE / DELETE は `SQL.createUpdater` メソッドで取得した，`Updater` の `execute` メソッドを呼び出して実行する。

        // パラメタ設定を行なう。
        Item parameter = new Item();
        parameter.setName("grape");
        parameter.setCode("4");

        // INSERT を実行
        SQL.createUpdater(
            connection,
            "INSERT INTO ITEM (ITEM_CD, ITEM_NM) VALUES(@code@, @name@)"
        ).execute(parameter);

        // UPDATE を実行
        SQL.createUpdater(
            connection,
            "UPDATE ITEM SET ITEM_NM=@name@ WHERE ITEM_CD = @code@"
        ).execute(parameter);

        // DELETE を実行
        SQL.createUpdater(
            connection,
            "DELETE FROM ITEM WHERE ITEM_CD = @code@"
        ).execute(parameter);

execute メソッドの引数に，java.util.List を渡すと複数のデータに対する操作を一括で実行することができる。

        // ITEM テーブルの全レコードを List に取得する。
        List<Item> itemList =
            SQL.createSelecter(
                connection,Item.class,
                "SELECT ITEM_CD AS code, ITEM_NM AS name FROM ITEM"
            ).find();

        // List の内容を ITEM2 テーブルに INSERT する。
        SQL.createUpdater(
            connection,
            "INSERT INTO ITEM2 (ITEM_CD, ITEM_NM) VALUES(@code@, @name@)"
        ).execute(itemList);

### ストアドプロシージャ・ストアドファンクションの呼び出し

ストアドプロシージャ・ストアドファンクションの呼び出しには `SQL.createCaller` メソッドで取得した，`Caller` の `execute` メソッドを呼び出して実行する。

        // パラメタ設定を行なう。
        Item parameter = new Item();
        parameter.setCode("1234");

        SQL.createCaller(
            connection,
            "{ @!code@ = call substr(@code@, 1, 2)}"
        ).execute(parameter);

out パラメタを指定する場合，@!...@ と記述する。
上記の例では，substr ファンクションの戻り値格納変数として `@!code@` を指定している。このSQLが実行されると，parameter オブジェクトの code プロパティに substr の結果が格納される。

なお，inout パラメタを指定する場合は @#...@ と記述する。