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) を忘れないように