4.4. Java コードによる SQL 文構築(更新 SQL の構築)
この章では、更新 SQL の構築について解説します。


INSERT の実行
jp.littrlesoft.sql.SQL クラスを拡張して使用することで、SELECT を実行せずに INSERT を実行することができます。
ここでは、INSERT 用オブジェクトを作成して、Employee の全項目を挿入する例を記述します。
// insertEmp を Employeeクラスに型指定して生成します
SQL<Employee> insertEmp = new SQL<Employee>() {{
    // insert() クラスを生成して 全項目を INSERT する準備をします
    insert().prepare();
}};

// 作成した SQL オブジェクトにパラメータを設定します
insertEmp.params.empId = new Long(123);
insertEmp.params.name = "鳩山 邦彦 ";
insertEmp.params.deptCode = 1;
    :
insertEmp.params.updateDatetime = new java.sql.Timestamp(System.currentTimeMillis());

// SQL オブジェクト(INSERT)を実行します
insertEmp.execute(conn, true, false);
insert() は INSERT を実行するクラスです。
insertEmp.params は、insertEmp のパラメータで Employee に型付けされています。
execute の引数は、順に下記の通りとなります。
    Connection conn: JDBC コネクション
    boolean pendingCommit: AutoCommit しない
    boolean reuseStatement: JDBC ステートメントを再利用する

INSERT 項目を明示する

対象データを INSERT する際、項目を明示して実行したい場合があります。
以下のコードでは、固定値を設定する場合、パラメータ値を設定する場合についての例を記述します。
// 固定値を設定する
SQL<Employee > insertEmp = new SQL<Employee>() {{
    insert().values(
        $($$.empId).accept(999),
        $($$.name).accept("鳩山 邦彦"),
        $($$.sex).accept(1),
            :
    ).prepare();
}};

// パラメータ値を設定する
SQL<Employee >insertEmp = new SQL<Employee>() {{
    insert().values(
        $($$.empId).accept(":empId"),
        $($$.name).accept(":name"),
        $($$.sex).accept(":sex"),
            :
    ).prepare();
}};
values(…) は、INSERT INTO テーブル名 VALUES(…) と同じになります。
accept(値) で、指定したカラムに値を設定します。

固定値を使用する場合は accept の引数に直接値を設定しますが、パラメータを使用する場合はコロン(:)付きのパラメータ名で設定を行います。
このように設定を行った場合、パラメータへは insertEmp.params の値が設定されます。

SELECT した結果から INSERT を行う

SELECT の結果をそのまま INSERT に使用したい場合があります。
以下のコードでは、同じ構造のテーブルの SELECT 結果をそのまま INSERTする場合、異なる構造のテーブルの SELECT 結果を INSERT する場合の例を記述します。
// 同じ構造のテーブルの SELECT 結果を INSERT します
SQL<EmployeeBackup> backupEmp = new SQL<EmployeeBackup>() {{
    // Employee のダミークラスを用意します
    Employee employee = $useDummy(Employee.class);
    insert()
        .// employee の SELECT 結果をそのまま insert() に設定します
        .select().from(employee)
    .prepare();
}};


// 異なる構造のテーブルの SELECT 結果を INSERT します
SQL<Test> test = new SQL<Test>() {{
    // Employee のダミークラスを用意します
    Employee employee = $useDummy(Employee.class);
    insert()
        .select(
            // into(カラム名) を使用して employee.empId を test.id にセットします
            $(employee.empId).into($$.id),
            // into(カラム名) を使用して employee.name を test.name にセットします
            $(employee.name).into($$.name)
        ).from(employee)
        .prepare();
}};
UPDATE の実行
データの更新を行う際は、UPDATE 用オブジェクト作成します。
以下のコードでは、UPDATE 用オブジェクトの update() クラスを作成して Employee の データを更新する例を記述します。
/** 社員給与を更新する UPDATE 用オブジェクト */
SQL<Employee> updateEmpSalary = new SQL<Employee>(){{
    update().set(
        $($$.memo).accept( $($$.memo).add("2009年度昇給") ),
        $($$.salary).accept( $($$.salary).multiply(1.25) )
    )
    .where($$.deptCode).is(":deptCode").end
    .prepare();
}};


/**
  *  給与昇給ボタン押下時の処理
  */
public onSalaryUp() {
    // updateEmpSalary を実行します
    updateEmpSalary.execute(conn, true, false);
}
update().set() メソッドでUPDATE テーブル名 SET … と同じ SQL が実行されます。
DELETE の実行
データ行の削除を行う際は、DELTE 用オブジェクトを作成します。
以下のコードでは、DELETE 用オブジェクトの delete() クラスを作成して Employee のデータを削除する例を記述します。
/** 社員を削除する DELETE 用オブジェクト */
SQL<Employee> deleteEmp = new SQL<Employee>() {{
    // DELETE を設定
    delete()
    .where($$.empId).is(:empId").end
    .prepare();
}};


/**
  *  削除ボタン押下時の処理
  */
public onDelete() {
    // deleteEmp を実行します
    deleteEmp.execute(conn, true, false);
}