レコードを HRDept.Employee 表に挿入するとします。これは以下のように定義されます。
CREATE TABLE HRDept.Employee( EMPNO CHAR(6) NOT NULL, FIRSTNME VARCHAR(12) NOT NULL, MIDINIT CHAR(1), LASTNAME VARCHAR(15), WORKDEPT CHAR(2), PHONENO CHAR(4), HIREDATE DATE, PRIMARY KEY(EMPNO))
対応する Bean は、以下のように定義されます。
public Employee { @Column(name="EMPNO") public String employeeId; @Column(name="FIRSTNME") public String firstName; @Column(name="MIDINIT") public String middleInitial; public String lastName; @Column(name="WORKDEPT") public String departmentId; @Column(name="PHONENO") public String extension; public Date hireDate; }
public int update(java.lang.String sql, Object... parameters)を使用すると、アプリケーション・ロジックは以下のコードのようになります。
Connection con = DriverManager.getConnection(...); Data db = DataFactory.getData(con); Employee newCollegeHire = new Employee("000010", "CHRISTINE", "I", "HAAS", "A00", "3978", new java.sql.Date(System.currentTimeMillis())); int oneCount = db.update( "INSERT INTO HRDept.Employee(EMPNO, FIRSTNME," + " MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE) " + "VALUES(:employeeId, :firstName, :middleInitial," + " :lastName, :departmentId, :extension," + " :hireDate )", newCollegeHire );
新規の「PAYROLL PROGRAMMING」プロジェクトを表 HRDept.PROJ に追加します。 ただし、update() メソッドの INSERT ステートメントに値を渡すために使用を計画している、DeptProject オブジェクトの projName、departNo、respEmp、および majProj プロパティーについての情報しかありません。
最終的には、DeptProject オブジェクトの残りのプロパティーについての情報も得ることになります。 「PAYROLL PROGRAMMING」プロジェクトのレコードを残りの情報を使用して更新するには、主キーとして使用される生成済み ID 列である、PROJID 列にある値を知る必要があります。
それで、新規レコードを挿入する際には、PROJID 列で生成される値を取得し、その値を DeptProject オブジェクトの projId プロパティーに置く手段が必要です。
以下に示すのは、HRDept.PROJ 表の定義です。
CREATE TABLE HRDept.PROJ (PROJID INTEGER GENERATED ALWAYS AS IDENTITY NOT NULL, PROJNAME VARCHAR(24), DEPTNO CHAR(3), RESPEMP CHAR(6), PRSTAFF DECIMAL(5, 2), PRSTDATE DATE, PRENDATE DATE, MAJPROJ INTEGER, PRIMARY KEY(PROJID))
以下に示すのは、DeptProject の定義であり、この表に対応する Bean です。
public class DeptProject { @GeneratedKey public Integer projId; public String projName; public String departNo; public String respEmp; public BigDecimal prStaff; public Date prStDate; public Date prEnDate; public String majProj; }
public int update (java.lang.String sql, Object... parameters)を使用すると、HRDept.PROJ 表に行を挿入するコードは以下のようになります。
Connection con = DriverManager.getConnection(...); Data db = DataFactory.getData(con); DeptProject newProject = new DeptProject ("PAYROLL PROGRAMMING", "A00", "000010", 319); // 319: GENERAL AD SYSTEMS int updateCount = db.update( "INSERT INTO " + "HRDept.PROJ(PROJNAME, DEPTNO, RESPEMP, MAJPROJ) " + "VALUES(:projName, :departNo, :respEmp, :majProj)", newProject);
DeptProject オブジェクトの projId プロパティーは @GeneratedKey アノテーションを使用して定義され、列 PROJID は必ず整数を生成する ID 列として定義されるので、PROJID 列の値は、制御が update() メソッドへの呼び出しから戻される前に、projId プロパティーに渡されます。
後からプロジェクトのスタッフ配置レベル、開始日付、および終了日付についての情報を得る場合は、プロジェクトの行を HRDept.PROJ 表で更新するときに projId の値を使用できます。
newProject.prStaff = ...; newProject.prStDate = ...; newProject.prEnDate = ...; oneCount = db.update("UPDATE HRDept.PROJ SET " + "PRSTAFF=:prStaff, PRSTDATE=:prStDate, " + "PRENDATE=:prEnDate WHERE PROJID=:projId ", newProject);
Bean なしで値を渡し、生成された値を取得して Bean 以外のオブジェクトに入れる場合は、以下のバージョンの update() メソッドを使用できます。
<T> T update(java.lang.String sql, Class<T> returnClass, String[] columnNames, Object... parameters)
戻りの型が Object[].class の場合、配列の先頭の n 個のエレメントは、generatedColNames パラメーターの列からの n 個の生成値です。 配列内の最後のエレメントは、更新カウントです。
戻りの型が単純で直接割り当て可能な JDBC クラスである場合、所定の型の単一の生成値が戻されます。 更新カウントは戻されません。
例えば、プロジェクトは Bean ではなく、Object[] によって表される場合があります。 HRDept.PROJ 表と、取得された新規プロジェクトの生成キーは、以下のように更新できます。
Object[] myProj = new Object[4]; myProj[0] = ...; myProj[1] = ...; myProj[2] = ...; myProj[3] = ...; String[] generatedColNames = new String[] {"PROJID"}; Integer generatedProjID; String sql = "INSERT INTO HRDept.PROJ(PROJNAME, DEPTNO, " + "RESPEMP, MAJPROJ) values (?, ?, ?, ?)"; generatedProjID = db.update( sql, Integer.class, generatedColNames, myProj);