コツコツ学習ブログ

プログラマのweb上のメモ的なもの

更新系 SQL文の送信

Javaにおける更新系SQLの送信処理

  • 送信すべきSQLの雛形を準備する
PreparedStatement pstmt = con.prepareStatement(SQL文のひながた);
//SQLの雛形として、あとで値が入る部分を?マークに置き換えたSQL文を""で囲んで記述する
//この?の部分はパラメータ(parameter)とよばれる
  • 雛形に値を流し込んでSQL文を組みたてる
pstmt.setInt(パラメータ番号, 数値); 
pstmt.setString(パラメータ番号, 文字列);
//他にも、setDouble()やsetDate()などがある
//パラメータ番号は1から始まることに注意 
  • 組み立て終えたSQL文をDBMSに送信する
int r = pstme.executeUpdate();
//int型の戻り値は、「処理の結果、データベース内で変更された行数」を表す
  • 処理結果を判定する executeUpdateの戻り値で判定
package sample;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {

        //JDBCドライバのロード(h2データベース)
        try {
            Class.forName("org.h2.Driver");
        } catch (ClassNotFoundException e) {
            throw new IllegalStateException("ドライバのロードに失敗しました");
        }
        //java.sql.connectionのインスタンスを取得
        Connection con = null;
        try {
            //DBへの接続
            con = DriverManager.getConnection("jdbc:h2:~/mydb", "sa", "");
            //送信すべきSQLの雛形を準備
            PreparedStatement pstmt = con.prepareStatement("DELETE FROM MONSTERS WHERE HP <= ? OR NAME = ?");
            pstmt.setInt(1, 20); //1番目の?に20を流し込む
            pstmt.setString(2, "スライム"); //1番目の?に20を流し込む
            //組み立て終えたSQL文をDBMSに送信する
            int r = pstmt.executeUpdate();
            //処理結果を判定する
            if (r != 0) {
                System.out.println(r + "件のモンスターを削除しました");
            } else {
                System.out.println("該当するモンスターはありませんでした");
            }
            //後片付け
            pstmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //DB接続の切断
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}