データベース コントロール メソッドから単一の行を返す
このトピックでは、データベース コントロールに追加でき、データベースから単一の行を返すメソッドについて説明します。
データベース コントロールの詳細については、データベース コントロール : Web サービスからデータベースを使用するを参照してください。
データベース コントロールの作成方法については、新しいデータベース コントロールを作成するを参照してください。
@jws:sql 文におけるパラメータの置換の詳細については、@jws:sql 文におけるパラメータの置換を参照してください。
データベース処理によって複数のカラムが返された場合、そのメソッドの戻り値を選択することができます。特定の条件を満たすオブジェクトを返すか、または java.util.HashMap を返すことができます。
特定のクラスのオブジェクトを返すには、特性を指定してクラスを宣言する必要があります。
クラスには、クエリによって返されるカラムの名前と一致する名前のメンバーを含める必要がある。データベースのカラム名では大文字と小文字が区別されないので、マッチングでも大文字と小文字が区別されません。クラスにはその他のメンバーを含めることができるが、少なくとも返されるカラムに対応するメンバーは必須です。
メンバーはデータベース内で対応するカラムの値を保持するのに適した型でなければならない。データベースと Java 間の各型のマッピングについては、データベース コントロールでデータベース フィールドの型を Java の型にマップするを参照してください。
クラスが内部クラス(別のクラスで宣言されたクラス)の場合、そのクラスを public static として宣言する必要がある。
このクラスはデータベース コントロールと密接に関係しているので、一般にはデータベース コントロールの CTRL ファイルでメイン インタフェースの内部クラスとして宣言します。ただし、上記の条件を満たしていればどの Java クラスでもかまいません。
次の例では、データベース コントロール メソッドからオブジェクトが返されます。
public static class Customer { public int custid; public String name; public Customer() {}; } /** * @sql statement="SELECT custid,name FROM customer WHERE custid={customerID}" */ Customer findCustomer(int customerID)
注意 : クラスのメンバー変数とクラス自体は、データベース コントロールが置換できるようにパブリックでなければなりません。
対応するデータベース フィールドに値が含まれていない場合、クラス メンバーはオブジェクトであれば null に設定され、プリミティブであれば 0 または false に設定されます。この点については、クラスで使用する型を決める際に注意が必要です。データベース フィールドにデータが含まれていない場合、Integer メンバーは値 null を受け取りますが、int メンバーは値 0 を受け取ります。ゼロは有効な値なので、Integer の代わりに int を使用すると、後続のコードで値がデータベースに存在したかどうかを判定できなくなります。
クラスのメンバーに対応するカラムがデータベースに存在しない場合、メンバーがプリミティブとオブジェクトのどちらであるかによって、メンバーは null または 0 に設定されます。
クエリがクラスのメンバーとマッチングできないカラムを返した場合、例外が送出されます。返されるカラムが不明な場合、またはカラムが変わる可能性がある場合、特定のクラスの代わりに HashMap を返すことを検討してください。
クエリによって行が返されなかった場合、データベース コントロール メソッドの戻り値は null となります。
この例では、メソッドは Customer 型の単一のオブジェクトを返すように宣言されています。そのため、データベース処理が複数の行を返した場合でも、最初の行のみがメソッドの呼び出し側に返されます。呼び出し側に複数の行を返す方法については、データベース コントロール メソッドから複数の行を返すを参照してください。
クエリによって返されるカラムの行数または特定のカラムの名前が不明または変わる可能性がある場合、HashMap を返すようにすることができます。
HashMap を返すには、メソッドの戻り値を java.util.HashMap として宣言します。
/** * @jws:sql statement="SELECT * FROM customer WHERE custid={custID}" */ public java.util.HashMap findCustomerHash(int custID);
返される HashMap には、結果内の各カラムのエントリが含まれます。各エントリのキーは対応するカラムの名前です。HashMap.keySet() で返されるキー名に大文字が使用されるかどうかはデータベース ドライバによって異なるので、HashMap のメソッドを使用してアクセスする場合、キーの大文字/小文字は区別されません。値は、データベース カラムの JDBC のデフォルト型のオブジェクトです。
データベース、Java、および JDBC 間の各型のマッピングについては、データベース コントロールでデータベース フィールドの型を Java の型にマップするを参照してください。
この例では、メソッドは java.util.HashMap 型の単一のオブジェクトを返すように宣言されています。そのため、データベース処理が複数の行を返した場合でも、最初の行のみがメソッドの呼び出し側に返されます。
呼び出し側に複数の行を返す方法については、データベース コントロール メソッドから複数の行を返すを参照してください。
呼び出し側の Web サービス(JWS ファイル)で返されたレコードの名前フィールドにアクセスするには、次のコードを使用します。
/** * @jws:control */ private CustomerDBControl custDB;
/** * @jws:operation */ public String getCustomerName(int custID) { java.util.HashMap hash; String name; hash = custDB.findCustomerHash(custID); if( hash != null ) { name = (String)hash.get("NAME"); } else { name = new String("Customer not found"); } return name; }
クエリによって行が返されなかった場合、データベース コントロール メソッドの戻り値は null となります。