ホーム > カテゴリ > Java・Android >

Javaでデータベース操作(検索/更新系SQL/プリペアドステートメント/トランザクション)

Javaの使い方(目次)

目次

1. 事前準備
  1-1. MySQLのインストールと設定
  1-2. JDBCドライバのダウンロードとEclipse設定
2. SELECT文(検索系SQL)
3. INSERT/UPDATE/DELETE文(更新系SQL)、プリペアドステートメント、トランザクション

1. 事前準備

今回のデータベースは「MySQL」を使用します。

1-1. MySQLのインストールと設定

MySQLのインストールからコマンド操作(ユーザ/データベース/テーブルの作成)やODBC設定

の記事をご覧になりMySQLをインストールして「ユーザー/データベース/テーブル」を作成します。なお、今回はODBCは扱いませんのでその部分は準備しなくて良いです。

1-2. JDBCドライバのダウンロードとEclipse設定

スタートメニューからMySQL Installer -communityを選択。

「add ...」ボタンを押します。

「Connector/J8.0.11 x86」を右リストに追加して「Next」ボタンを押します。※8.0.11 x86はバージョンや環境により異なります。

後はどんどん先に進んで「Finish」で完了です。

次はEclipseの設定です。

C:\Program Files (x86)\MySQL\Connector J 8.0」の中に「mysql-connector-java-8.0.11.jar」がありますので、それをEclipse側のメニューの[プロジェクト][プロパティ]を選択後、[Javaのビルド・パス]の[ライブラリー]タブにある「外部JARの追加」でライブラリとして追加します。

※パスはOS環境、8.0/8.0.11はバージョンにより異なります。

2. SELECT文(検索系SQL)

次はデータベース(sample_db)のmst_dummyテーブルから全データを取得します。SQLインジェクションを対策するには次章のプリペアドステートメント(パラメータ付きSQL)を使用して下さい。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Main {

    public static void main(final String[] args){

        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;

        // JDBCの各設定
        // ※jdbc:mysql://localhost/データベース名
        // ※?以降はMySQLの設定により必要ないです。SSLを無効、タイムゾーンをUTCにしています。
        String url  = "jdbc:mysql://localhost/sample_db?useSSL=false&serverTimezone=UTC";
        String user = "test";        // ユーザー名
        String pass = "1234567890";  // パスワード

        try {
            // データベースに接続
            con = DriverManager.getConnection(url,user,pass);

            // ステートメントオブジェクトを作成
            stmt = con.createStatement();

            // SQLの作成
            String sql = "select no,title from mst_dummy";

            // SQLの実行
            rs = stmt.executeQuery(sql);

            System.out.println("--------------------");
            System.out.println("no  title");
            System.out.println("--------------------");

            // 結果セットからデータを取り出す
            while(rs.next()) {
              int no = rs.getInt("no");
              String title = rs.getString("title");
              System.out.print(no + "\t");
              System.out.println(title);
            }

            System.out.println("--------------------");

          } catch (Exception e) {
              System.out.println(e.getMessage());
          }finally {

              // 各オブジェクトを解放する
              if(rs != null) {
                  try {
                      rs.close();
                  }catch (Exception e) {
                      System.out.println(e.getMessage());
                }
              }

              if(stmt != null) {
                  try {
                      stmt.close();
                  }catch (Exception e) {
                      System.out.println(e.getMessage());
                }
              }

              if(con != null) {
                  try {
                      con.close();
                  }catch (Exception e) {
                      System.out.println(e.getMessage());
                }
              }
          }
    }
}

結果

--------------------
no title
--------------------
1 あいうえお
2 かきくけこ
--------------------

3. INSERT/UPDATE/DELETE文(更新系SQL)、プリペアドステートメント、トランザクション

この例ではUPDATE文ですがINSERT/DELETE文でも同様です。

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

public class Main {

    public static void main(final String[] args){

        Connection con = null;
        PreparedStatement pstmt = null;

        // JDBCの各設定
        // ※jdbc:mysql://localhost/データベース名
        // ※?以降はMySQLの設定により必要ないです。SSLを無効、タイムゾーンをUTCにしています。
        String url  = "jdbc:mysql://localhost/sample_db?useSSL=false&serverTimezone=UTC";
        String user = "test";        // ユーザー名
        String pass = "1234567890";  // パスワード

        try {
            // データベースに接続
            con = DriverManager.getConnection(url,user,pass);

            // プリペアドステートメント(パラメータ付きSQL)を作成
            // ※プリペアドステートメントは「SQLインジェクション」の対策です。
            pstmt = con.prepareStatement("UPDATE mst_dummy set title=? WHERE no=?");

            pstmt.setString(1, "プチモンテ");
            pstmt.setInt(2, 1);

            // トランザクションの開始
            con.setAutoCommit(false);
            try {
                // SQLの実行(INSERT文、UPDATE文、DELETE文でも可能)
                int count = pstmt.executeUpdate();

                System.out.println(count + "件のデータを更新しました。");

                // コミット
                con.commit();
            }catch (Exception e) {

                // ロールバック
                con.rollback();

                System.out.println("データの更新に失敗しました。");
            }
          } catch (Exception e) {
              System.out.println(e.getMessage());
          }finally {
              // 各オブジェクトを解放する
              if(pstmt != null) {
                  try {
                      pstmt.close();
                  }catch (Exception e) {
                      System.out.println(e.getMessage());
                }
              }

              if(con != null) {
                  try {
                      con.close();
                  }catch (Exception e) {
                      System.out.println(e.getMessage());
                }
              }
          }
    }
}

実行前

実行後





関連記事



公開日:2018年05月08日
記事NO:02649