実はprepareStatementでSQL以外のものを渡すことができる
prepareStatement(String sql)
以外の指定があります。
ということに最近弊プロダクトのコードを見ていて気づいたので、色々みた結果をまとめます。
Javaのバージョン
Javaのバージョン1.8.0_20
で確認しています。
prepareStatementに渡せる最大引数について
最大は以下の引数指定かと思います。
PreparedStatement prepareStatement(String sql, int resultSetType,
int resultSetConcurrency, int resultSetHoldability)
渡すSQL以外に指定する値について、見ていきます。
ResultSetTypeについて
resultSetTypeは指定可能なものが3つあります。
* @param resultSetType one of the following <code>ResultSet</code>
* constants:
* <code>ResultSet.TYPE_FORWARD_ONLY</code>,
* <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>, or
* <code>ResultSet.TYPE_SCROLL_SENSITIVE</code>
TYPE_FORWARD_ONLY:カーソルを前方にのみ移動が可能
TYPE_SCROLL_INSENSITIVE:スクロール可能ですが、変更は反映されません
TYPE_SCROLL_SENSITIVE:スクロール可能、且つ、他による変更も反映されます
resultSetConcurrencyについて
resultSetConcurrencyは指定可能なものが2つあります。
* @param resultSetConcurrency one of the following <code>ResultSet</code>
* constants:
* <code>ResultSet.CONCUR_READ_ONLY</code> or
* <code>ResultSet.CONCUR_UPDATABLE</code>
CONCUR_READ_ONLY:ResultSetはデータの読み出しのみ
CONCUR_UPDATABLE:ResultSetは変更可能で、カーソルを動かして挿入や変更、削除ができる
※ResultSetの更新機能を利用してデータを更新することができます(参考リンク)
resultSetHoldabilityについて
resultSetHoldabilityは指定可能なものが2つあります。
* @param resultSetHoldability one of the following <code>ResultSet</code>
* constants:
* <code>ResultSet.HOLD_CURSORS_OVER_COMMIT</code> or
* <code>ResultSet.CLOSE_CURSORS_AT_COMMIT</code>
HOLD_CURSORS_OVER_COMMIT:トランザクションがコミットされたタイミングでResultSetはオープンしたままになります
CLOSE_CURSORS_AT_COMMIT:トランザクションがコミットされたタイミングでオープンしているResultSetオブジェクトはクローズします
まとめ
つまり
・ResultSetType:カーソルを前後に動かせるか、カーソルを動かしたときにResultSetの変更を参照するか
・resultSetConcurrency:ResultSetが変更可能であるか
・resultSetHoldability:ResultSetのクローズのタイミング
ということですね。
参照:
https://docs.oracle.com/javase/jp/8/docs/api/java/sql/Statement.html
https://docs.oracle.com/javase/jp/8/docs/api/java/sql/ResultSet.html