ホーム > カテゴリ > 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


この記事を書いた人

💻 ITスキル・経験
サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。

画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ
プチモンテ代表、アーティスト名:プチモンテ
🎵 音楽制作
BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は叙情詩、叙情的な楽曲が多い。楽曲制作は2023年12月中旬 ~

オリジナル曲を始めました✨

YouTubeで各楽曲を公開しています🌈
https://www.youtube.com/@petitmonte

【男性ボーカル】DA・KA・RA | 新たな明日が風と共に訪れる

【男性、女性ボーカル】時空を超越する先に | 時空と風の交響曲

【女性、男性ボーカル】絆 | 穏やかな心に奏でる旋律