servletとDBのデータ処理
SQL文での?(クエスチョン)の使用
SQL文で?を使用することで、後で該当箇所に文字列を代入することが
できる HTMLのフォームから文字列を受け取り、その文字列をSQL文に代入するなどして便利に利用できる
String table = request.getParameter("table-name"); //table名を取得
String column = request.getParameter("column-name"); //column名を取得
st = con.prepareStatement("select * from ? where ?"); //SQL文に?が2つ
st.setString(1, table); //1つ目の?にtableを代入
st.setString(2, column + "%"); //2つ目の?にcolumnを代入
SQLインジェクション(不正入力)の防止
SQL文の文字列操作の際に、Statementインタフェースを使用してしまうと文字列操作の際に、Statementインタフェースを使用してしまうと入力された文字列をそのままSQL文に代入してしまう入力された文字列をそのままSQL文に代入してしまうそのためIDとパスワードを入力させてログインするような処理で、パスワード入力を回避してログインできてしまう問題(SQLインジェクション)がある
そのため普通はStatementインタフェースは使用せず、
PreparedStatementインタフェースを使用する必要がある
SQL文の実行
◇PreparedStatement.executeQuery()
select文の実行に使われるメソッド
イテレータとしてnext()メソッドを使用する
◇PreparedStatement.executeUpdate()
insert文、update文、delete文の実行に使われるメソッド
戻り値として更新された行数が整数(int)で返る
トランザクション(transaction)
SQLで複数の操作を同時処理させたい場合、そのまとまりをトランザクションと呼び、処理を確定したい場合にはコミット(void commit())、トランザクション前に戻したい場合はロールバック(void rollback())をそれぞれ行う
setAutoCommitメソッド
コミットに関して標準ではSQL1文ずつに自動コミットされる機能が有効になっており、コミットやロールバックを自分のタイミングで行いたい場合はsetAutoCommit(false)と機能を無効にしておく必要がある
※Connection.close前に元に戻す setAutoCommit(true) を忘れないように