public class NamedParameterStatement
extends java.lang.Object
JDBCのPreparedStatementはパラメーターのプレースホルダーとして ? をサポートしていますが、 これは名前によるパラメーターの指定をサポートしておらず、? の出現順によってパラメーターを指定する必要があります。 一部のデータベース製品のJDBCドライバーには独自に名前付きパラメーターをサポートしているものもありますが、 データベース製品固有の方法で名前付きパラメーターを実装しているため、汎用性がなくなります。
このユーティリティークラスは特定のJDBCドライバー実装に依存することなく名前付きパラメーターをサポートします。
NamedParameterStatementではパラメーターのプレースホルダーとして :name という形式を使用します。 :に続く文字列がパラメーター名です。
id列に値を指定してPersonテーブルを取得する場合は以下のようになります。
String sql = "SELECT * FROM Person WHERE id = :id";
NamedParameterStatement npst = new NamedParameterStatement(sql);
npst.setInt("id", 3);
PreparedStatement st = cn.prepareStatement(npst.getSql());
for(NamedParameter parameter : npst.getParameters()) {
parameter.applyTo(st);
}
ResultSet rs = st.executeQuery();
getSql()は名前付きパラメーターのプレースホルダーを
名前なしパラメーターのプレースホルダー ? に置き換えたSQL文を返します。
そのため、getSql()が返すSQL文はJDBC標準のPreparedStatementを作成するのに使えます。
NamedParameterStatementにパラメーターの値を設定するメソッド(setInt(String, int) など)は
第1引数にパラメーターの出現順ではなく、パラメーターの名前を指定することができます。
NamedParameterStatementにパラメーターを設定すると、内部にNamedParameterが作成されます。
NamedParameterはパラメーターの名前と値だけでなくパラメーターの出現順序も保持しています。
NamedParameter.applyTo(PreparedStatement)を呼び出すと、パラメーターの出現順序を使用して
PreparedStatementにパラメーターを設定します。
PreparedStatement st = cn.prepareStatement(npst.getSql());
for(NamedParameter parameter : npst.getParameters()) {
parameter.applyTo(st);
}
このコードは以下のように書くこともできます。
PreparedStatement st = cn.prepareStatement(npst.getSql());
for(NamedParameter parameter : npst.getParameters()) {
st.setObject(parameter.getIndex(), parameter.getValue());
}
NamedParameterStatementは名前付きパラメーターを持つSQL文から、 パラメーターのプレースホルダー ? を使ったJDBC標準のSQL文と パラメーターのプレースホルダー出現順(インデックス)を保持したパラメーターに分解する機能を提供します。 これにより任意のPreparedStatemntで名前付きパラメーターを利用できるようになります。 NamedParameterStatementはユーティリティー・クラスであり、 実際にデータベースへアクセスするのはJDBCドライバー固有のPreparedStatement実装です。 そのため、JDBCドライバー固有のPreparedStatementが持つプリコンパイル機能や最適化が損なわれることもありません。
| コンストラクタと説明 |
|---|
NamedParameterStatement(java.lang.String sql)
指定したSQL文で名前付きパラメーター・ステートメントを作ります。
|
| 修飾子とタイプ | メソッドと説明 |
|---|---|
void |
clearParameters()
パラメーターに設定していた値をすべてクリアします。
|
int[] |
getIndexesBy(java.lang.String parameterName)
指定したパラメーターの出現順を配列で取得します。
|
java.lang.String |
getOriginalSql()
コンストラクタで指定された元のSQL文を取得します。
|
java.util.Set<java.lang.String> |
getParameterNames()
このNamedParameterStatementが持つパラメーター名のセットを取得します。
|
NamedParameter[] |
getParameters()
設定したパラメーターの値を持つ
NamedParameter配列を返します。 |
java.lang.String |
getSql()
JDBCで使用するSQL文を取得します。
|
void |
setArray(java.lang.String parameterName,
java.sql.Array x)
指定されたパラメーターを指定されたjava.sql.Arrayオブジェクトに設定します。
|
void |
setAsciiStream(java.lang.String parameterName,
java.io.InputStream x)
指定されたパラメーターを指定された入力ストリームに設定します。
|
void |
setAsciiStream(java.lang.String parameterName,
java.io.InputStream x,
int length)
指定されたパラメーターを指定されたバイト数を持つ指定された入力ストリームに設定します。
|
void |
setAsciiStream(java.lang.String parameterName,
java.io.InputStream x,
long length)
指定されたパラメーターを指定されたバイト数を持つ指定された入力ストリームに設定します。
|
void |
setBigDecimal(java.lang.String parameterName,
java.math.BigDecimal x)
指定されたパラメーターを指定されたjava.math.BigDecimal値に設定します。
|
void |
setBinaryStream(java.lang.String parameterName,
java.io.InputStream x)
指定されたパラメーターを指定された入力ストリームに設定します。
|
void |
setBinaryStream(java.lang.String parameterName,
java.io.InputStream x,
int length)
指定されたパラメーターを指定されたバイト数を持つ指定された入力ストリームに設定します。
|
void |
setBinaryStream(java.lang.String parameterName,
java.io.InputStream x,
long length)
指定されたパラメーターを指定されたバイト数を持つ指定された入力ストリームに設定します。
|
void |
setBlob(java.lang.String parameterName,
java.sql.Blob x)
指定されたパラメーターを指定されたjava.sql.Blobオブジェクトに設定します。
|
void |
setBlob(java.lang.String parameterName,
java.io.InputStream x)
指定されたパラメーターをInputStreamオブジェクトに設定します。
|
void |
setBlob(java.lang.String parameterName,
java.io.InputStream x,
long length)
指定されたパラメーターをInputStreamオブジェクトに設定します。
|
void |
setBoolean(java.lang.String parameterName,
boolean x)
指定されたパラメーターを指定されたJavaのboolean値に設定します。
|
void |
setByte(java.lang.String parameterName,
byte x)
指定されたパラメーターを指定されたJavaのbyte値に設定します。
|
void |
setBytes(java.lang.String parameterName,
byte[] x)
指定されたパラメーターを指定されたJavaのバイト配列に設定します。
|
void |
setCharacterStream(java.lang.String parameterName,
java.io.Reader x)
指定されたパラメーターを指定されたReaderオブジェクトに設定します。
|
void |
setCharacterStream(java.lang.String parameterName,
java.io.Reader x,
int length)
指定されたパラメーターを指定された文字数である指定されたReaderオブジェクトに設定します。
|
void |
setCharacterStream(java.lang.String parameterName,
java.io.Reader x,
long length)
指定されたパラメーターを指定された文字数である指定されたReaderオブジェクトに設定します。
|
void |
setClob(java.lang.String parameterName,
java.sql.Clob x)
指定されたパラメーターを指定されたjava.sql.Clobオブジェクトに設定します。
|
void |
setClob(java.lang.String parameterName,
java.io.Reader x)
指定されたパラメーターをReaderオブジェクトに設定します。
|
void |
setClob(java.lang.String parameterName,
java.io.Reader x,
long length)
指定されたパラメーターをReaderオブジェクトに設定します。
|
void |
setDate(java.lang.String parameterName,
java.sql.Date x)
アプリケーションを実行している仮想マシンのデフォルトのタイムゾーンを使用して、
指定されたパラメーターを指定されたjava.sql.Date値に設定します。
|
void |
setDate(java.lang.String parameterName,
java.sql.Date x,
java.util.Calendar calendar)
指定されたCalendarオブジェクトを使用して、指定されたパラメーターを指定されたjava.sql.Date値に設定します。
|
void |
setDouble(java.lang.String parameterName,
double x)
指定されたパラメーターを指定されたJavaのdouble値に設定します。
|
void |
setFloat(java.lang.String parameterName,
float x)
指定されたパラメーターを指定されたJavaのfloat値に設定します。
|
void |
setInt(java.lang.String parameterName,
int x)
指定されたパラメーターを指定されたJavaのint値に設定します。
|
void |
setLong(java.lang.String parameterName,
long x)
指定されたパラメーターを指定されたJavaのlong値に設定します。
|
void |
setNCharacterStream(java.lang.String parameterName,
java.io.Reader x)
指定されたパラメーターをReaderオブジェクトに設定します。
|
void |
setNCharacterStream(java.lang.String parameterName,
java.io.Reader x,
long length)
指定されたパラメーターをReaderオブジェクトに設定します。
|
void |
setNClob(java.lang.String parameterName,
java.sql.NClob x)
指定されたパラメーターをjava.sql.NClobオブジェクトに設定します。
|
void |
setNClob(java.lang.String parameterName,
java.io.Reader x)
指定されたパラメーターをReaderオブジェクトに設定します。
|
void |
setNClob(java.lang.String parameterName,
java.io.Reader x,
long length)
指定されたパラメーターをReaderオブジェクトに設定します。
|
void |
setNString(java.lang.String parameterName,
java.lang.String x)
指定されたパラメーターを指定されたStringオブジェクトに設定します。
|
void |
setNull(java.lang.String parameterName,
int sqlType)
指定されたパラメーターをSQL NULLに設定します。
|
void |
setNull(java.lang.String parameterName,
int sqlType,
java.lang.String typeName)
指定されたパラメーターをSQL NULLに設定します。
|
void |
setObject(java.lang.String parameterName,
java.lang.Object x)
指定されたパラメーターの値を指定されたオブジェクトを使用して設定します。
|
void |
setObject(java.lang.String parameterName,
java.lang.Object x,
int targetSqlType)
指定されたパラメーター値を指定されたオブジェクトで設定します。
|
void |
setObject(java.lang.String parameterName,
java.lang.Object x,
int targetSqlType,
int scaleOrLength)
指定されたパラメーターの値を指定されたオブジェクトで設定します。
|
void |
setRef(java.lang.String parameterName,
java.sql.Ref x)
指定されたパラメーターを指定されたREF(<structured-type>)値に設定します。
|
void |
setRowId(java.lang.String parameterName,
java.sql.RowId x)
指定されたパラメーターを指定されたjava.sql.RowIdオブジェクトに設定します。
|
void |
setShort(java.lang.String parameterName,
short x)
指定されたパラメーターを指定したJavaのshort値に設定します。
|
void |
setSQLXML(java.lang.String parameterName,
java.sql.SQLXML x)
指定されたパラメーターを指定されたjava.sql.SQLXMLオブジェクトに設定します。
|
void |
setString(java.lang.String parameterName,
java.lang.String x)
指定されたパラメーターを指定されたJavaのString値に設定します。
|
void |
setTime(java.lang.String parameterName,
java.sql.Time x)
指定されたパラメーターを指定されたjava.sql.Time値に設定します。
|
void |
setTime(java.lang.String parameterName,
java.sql.Time x,
java.util.Calendar calendar)
指定されたCalendarオブジェクトを使用して、指定されたパラメーターを指定されてjava.sql.Time値に設定します。
|
void |
setTimestamp(java.lang.String parameterName,
java.sql.Timestamp x)
指定されたパラメーターを指定されたjava.sql.Timestamp値に設定します。
|
void |
setTimestamp(java.lang.String parameterName,
java.sql.Timestamp x,
java.util.Calendar calendar)
指定されたCalendarオブジェクトを使用して、指定されたパラメーターを指定されたjava.sql.Timestamp値に設定します。
|
void |
setURL(java.lang.String parameterName,
java.net.URL x)
指定されたパラメーターを指定されたjava.net.URL値に設定します。
|
java.lang.String |
toString()
オブジェクトの文字列表現を返します。
|
public NamedParameterStatement(java.lang.String sql)
パラメーターのプレースホルダーには ? ではなく :name 形式を使用します。
sql - 名前付きパラーメーターのプレースホルダーを含むSQL文public java.lang.String getOriginalSql()
このメソッドが返すSQL文は加工されていないため、 名前付きパラメーターのプレースホルダー :name を含みます。
public java.lang.String getSql()
このメソッドが返すSQL文は名前付きパラメーターのプレースホルダー :name が JDBC標準のパラメーター・プレースホルダー ? に置き換えられています。
public java.util.Set<java.lang.String> getParameterNames()
"SELECT * FROM Product WHERE category = :category AND price > :price" というSQL文を コンストラクタで指定した場合、このメソッドが返すパラメーター名のセットには "category" と "price" が含まれます。 パラメータ名には : は含まれません。
public int[] getIndexesBy(java.lang.String parameterName)
このメソッドが返すパラメーターの出現順は0ではなく1から始まります。 この値はPreparedStatementのパラメーター指定に使用することができます。
"SELECT * FROM Product WHERE price >= :price AND (flag = :param1 OR (:param1 is null AND flag is null))" というSQL文を コンストラクタで指定した場合、getIndexesBy("param1") は int[] { 2, 3 } を返します。
parameterName - パラメーターの名前public void clearParameters()
public NamedParameter[] getParameters()
NamedParameter配列を返します。public void setArray(java.lang.String parameterName,
java.sql.Array x)
parameterName - パラメーターの名前x - SQL ARRAY値をマッピングするArrayオブジェクトpublic void setAsciiStream(java.lang.String parameterName,
java.io.InputStream x)
parameterName - パラメーターの名前x - ASCIIパラメーター値を含むJava入力ストリームpublic void setAsciiStream(java.lang.String parameterName,
java.io.InputStream x,
int length)
parameterName - パラメーターの名前x - ASCIIパラメーター値を含むJava入力ストリームlength - ストリームのバイト数public void setAsciiStream(java.lang.String parameterName,
java.io.InputStream x,
long length)
parameterName - パラメーターの名前x - ASCIIパラメーター値を含むJava入力ストリームlength - ストリームのバイト数public void setBigDecimal(java.lang.String parameterName,
java.math.BigDecimal x)
parameterName - パラメーターの名前x - パラメーターの値public void setBinaryStream(java.lang.String parameterName,
java.io.InputStream x)
parameterName - パラメーターの名前x - バイナリ・パラメーター値を含むJava入力ストリームpublic void setBinaryStream(java.lang.String parameterName,
java.io.InputStream x,
int length)
parameterName - パラメーターの名前x - バイナリ・パラメーター値を含むJava入力ストリームlength - ストリームのバイト数public void setBinaryStream(java.lang.String parameterName,
java.io.InputStream x,
long length)
parameterName - パラメーターの名前x - バイナリ・パラメーター値を含むJava入力ストリームlength - ストリームのバイト数public void setBlob(java.lang.String parameterName,
java.sql.Blob x)
parameterName - パラメーターの名前x - SQL BLOB値をマッピングするBlobオブジェクトpublic void setBlob(java.lang.String parameterName,
java.io.InputStream x)
setBinaryStream(String, InputStream)メソッドと異なり、
パラメーター値をBLOBとしてサーバーに送信するべきであることをドライバーに通知します。parameterName - パラメーターの名前x - パラメーター値に設定されるデータを含むオブジェクトpublic void setBlob(java.lang.String parameterName,
java.io.InputStream x,
long length)
setBinaryStream(String, InputStream, int)メソッドと異なり、
パラメーター値をBLOBとしてサーバーに送信するべきであることをドライバーに通知します。parameterName - パラメーターの名前x - パラメーター値に設定されるデータを含むオブジェクトlength - パラメーター・データ内のバイト数public void setBoolean(java.lang.String parameterName,
boolean x)
parameterName - パラメーターの名前x - パラメーターの値public void setByte(java.lang.String parameterName,
byte x)
parameterName - パラメーターの名前x - パラメーターの値public void setBytes(java.lang.String parameterName,
byte[] x)
parameterName - パラメーターの名前x - パラメーターの値public void setCharacterStream(java.lang.String parameterName,
java.io.Reader x)
parameterName - パラメーターの名前x - Unicodeを格納するjava.io.Readerオブジェクトpublic void setCharacterStream(java.lang.String parameterName,
java.io.Reader x,
int length)
parameterName - パラメーターの名前x - Unicodeデータを格納するjava.io.Readerオブジェクトlength - ストリーム内の文字数public void setCharacterStream(java.lang.String parameterName,
java.io.Reader x,
long length)
parameterName - パラメーターの名前x - Unicodeデータを格納するjava.io.Readerオブジェクトlength - ストリーム内の文字数public void setClob(java.lang.String parameterName,
java.sql.Clob x)
parameterName - パラメーターの名前x - SQL CLOB値をマッピングするClobオブジェクトpublic void setClob(java.lang.String parameterName,
java.io.Reader x)
setCharacterStream(String, Reader)メソッドと異なり、
パラメーター値をCLOBとしてサーバーに送信するべきであることをドライバーに通知します。parameterName - パラメーターの名前x - パラメーター値に設定されるデータを含むオブジェクトpublic void setClob(java.lang.String parameterName,
java.io.Reader x,
long length)
setCharacterStream(String, Reader, int)メソッドと異なり、
パラメーター値をCLOBとしてサーバーに送信するべきであることをドライバーに通知します。parameterName - パラメーターの名前x - パラメーター値に設定されるデータを含むオブジェクトlength - パラメーター・データ内の文字数public void setDate(java.lang.String parameterName,
java.sql.Date x)
parameterName - パラメーターの名前x - パラメーターの値public void setDate(java.lang.String parameterName,
java.sql.Date x,
java.util.Calendar calendar)
parameterName - パラメーターの名前x - パラメーターの値calendar - ドライバーが日付を作成するために使用するCalendarオブジェクトpublic void setDouble(java.lang.String parameterName,
double x)
parameterName - パラメーターの名前x - パラメーターの値public void setFloat(java.lang.String parameterName,
float x)
parameterName - パラメーターの名前x - パラメーターの値public void setInt(java.lang.String parameterName,
int x)
parameterName - パラメーターの名前x - パラメーターの値public void setLong(java.lang.String parameterName,
long x)
parameterName - パラメーターの名前x - パラメーターの値public void setNCharacterStream(java.lang.String parameterName,
java.io.Reader x)
parameterName - パラメーターの名前x - パラメーターの値public void setNCharacterStream(java.lang.String parameterName,
java.io.Reader x,
long length)
parameterName - パラメーターの名前x - パラメーターの値length - パラメーター・データ内の文字数public void setNClob(java.lang.String parameterName,
java.sql.NClob x)
parameterName - パラメーターの名前x - パラメーターの値public void setNClob(java.lang.String parameterName,
java.io.Reader x)
setCharacterStream(String, Reader)メソッドと異なり、
パラメーター値をNCLOBとしてサーバーに送信するべきであることをドライバーに通知します。parameterName - パラメーターの名前x - パラメーターの値public void setNClob(java.lang.String parameterName,
java.io.Reader x,
long length)
setCharacterStream(String, Reader, int)メソッドと異なり、
パラメーター値をNCLOBとしてサーバーに送信するべきであることをドライバーに通知します。parameterName - パラメーターの名前x - パラメーターの値length - パラメーター・データ内の文字数public void setNString(java.lang.String parameterName,
java.lang.String x)
parameterName - パラメーターの名前x - パラメーターの値public void setNull(java.lang.String parameterName,
int sqlType)
parameterName - パラメーターの名前sqlType - java.sql.Typesで定義されるSQL型コードpublic void setNull(java.lang.String parameterName,
int sqlType,
java.lang.String typeName)
parameterName - パラメーターの名前sqlType - java.sql.Typesで定義されるSQL型コードtypeName - SQLユーザー定義型の完全指定の名前。パラメーターがユーザー定義型でもREFでもない場合は無視されます。public void setObject(java.lang.String parameterName,
java.lang.Object x)
JDBCの仕様では、JavaのObject型からSQL型への標準マッピングを規定しています。 指定された引数は、データベースに送られる前に、対応するSQL型に変換されます。
このメソッドは、ドライバー固有のJava型を使用して、データベース固有の抽象データ型を渡すために使用することに注意してください。 オブジェクトがインターフェースSQLDataを実装するクラスのインスタンスである場合、 JDBCドライバーはSQLData.writeSQLメソッドを呼び出して、そのオブジェクトをSQLデータ・ストリームへ書き込む必要があります。 また、オブジェクトがRef、Blob、Clob、NClob、Struct、java.net.URL、RowId、SQLXML、またはArrayを実装するクラスのオブジェクトである場合、 ドライバーはこのオブジェクトを対応するSQL型の値としてデータベースに渡すべきです。
parameterName - パラメーターの名前x - 入力パラメーター値を含むオブジェクトpublic void setObject(java.lang.String parameterName,
java.lang.Object x,
int targetSqlType)
このメソッドは、setObject(String, Object, int, int) に似ていますが、scaleOrLengthに0を仮定している点が異なります。
parameterName - パラメーターの名前x - 入力パラメーター値を含むオブジェクトtargetSqlType - データベースに送られる(java.sql.Typesで定義される)SQL型public void setObject(java.lang.String parameterName,
java.lang.Object x,
int targetSqlType,
int scaleOrLength)
2番目の引数がInputStreamである場合、ストリームにはscaleOrLengthで指定されるバイト数が含まれる必要があります。 2番目の引数がReaderである場合、リーダーにはscaleOrLengthで指定される文字数が含まれる必要があります。 そうでない場合は、PreparedStatementの実行時にSQLExceptionが生成されます。
指定されたJavaオブジェクトは、データベースに送られる前に、指定されたtargetSqlTypeに変換されます。 オブジェクトがカスタム・マッピングを持つ場合(オブジェクトがインターフェースSQLDataを実装するクラスのインスタンスである場合)、 JDBCドライバーはSQLData.writeSQLメソッドを呼び出して、そのオブジェクトをSQLデータ・ストリームへ書き込む必要があります。 また、オブジェクトがRef、Blob、Clob、NClob、Struct、java.net.URL、またはArrayを実装するクラスのオブジェクトである場合、 ドライバーはこのオブジェクトを対応するSQL型の値としてデータベースに渡す必要があります。
このメソッドは、データベース固有の抽象データ型を渡すために使用することに注意してください。
parameterName - パラメーターの名前x - 入力パラメーター値を含むオブジェクトtargetSqlType - データベースに送られる(java.sql.Typesで定義される)SQL型。scaleOrLength引数で、さらにこの型を限定できます。scaleOrLength - java.sql.Types.DECIMALまたはjava.sql.Types.NUMERICの場合、これは小数点のあとの桁数になります。Javaオブジェクト型InputStreamおよびReaderの場合はストリームまたはReaderのデータ長。ほかのすべての型ではこの値は無視されます。public void setRef(java.lang.String parameterName,
java.sql.Ref x)
parameterName - パラメーターの名前x - SQL REF値public void setRowId(java.lang.String parameterName,
java.sql.RowId x)
parameterName - パラメーターの名前x - パラメーターの値public void setShort(java.lang.String parameterName,
short x)
parameterName - パラメーターの名前x - パラメーターの値public void setSQLXML(java.lang.String parameterName,
java.sql.SQLXML x)
parameterName - パラメーターの名前x - SQL XML値をマッピングするSQLXMLオブジェクトpublic void setString(java.lang.String parameterName,
java.lang.String x)
parameterName - パラメーターの名前x - パラメーターの値public void setTime(java.lang.String parameterName,
java.sql.Time x)
parameterName - パラメーターの名前x - パラメーターの値public void setTime(java.lang.String parameterName,
java.sql.Time x,
java.util.Calendar calendar)
parameterName - パラメーターの名前x - パラメーターの値calendar - ドライバーが時間作成するために使用するCalendarオブジェクトpublic void setTimestamp(java.lang.String parameterName,
java.sql.Timestamp x)
parameterName - パラメーターの名前x - パラメーターの値public void setTimestamp(java.lang.String parameterName,
java.sql.Timestamp x,
java.util.Calendar calendar)
parameterName - パラメーターの名前x - パラメーターの値calendar - ドライバーがタイムスタンプを作成するために使用するCalendarオブジェクトpublic void setURL(java.lang.String parameterName,
java.net.URL x)
parameterName - パラメーターの名前x - パラメーターの値public java.lang.String toString()
toString クラス内 java.lang.Object