データベース連携(JDBC)

(ブログ記事の一覧は「こちら」)

JavaのWebアプリで、DB(データベース)にアクセスする方法について確認していきましょう。

DBの作成、準備

Windowsの環境の場合、XAMMPを用いて、以下を構築してください。

DBを作成

db_sa2_sample

テーブルを生成

tbl_sa2_sample

テーブルの構造

名前 データ型 その他
id int primary
name varchar(128) -
hobby varchar(128) -

【参考】テーブル作成のSQL

CREATE TABLE `db_sa2_sample`.`tbl_sa2_sample` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(128) NOT NULL , `hobby` VARCHAR(128) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;

ダウンロード

以下のURLから、必要なjarファイルをダウンロードします。
https://downloads.mysql.com/archives/c-j/

バージョンは「5.1.xx」を選択してください。「mysql-connector-java-5.1.xx-bin.jar」を使用します。

プロジェクトの設定

「プロジェクト名」を右クリックして、「ビルド・パス」-「ビルド・パスの構成」を選択します。 (Eclipseの環境によっては、「プロジェクト名」を右クリックして、「プロパティ」を選択して、「Javaのビルド・パス」を選択します。)

Javaのビルド・パス」ウィンドウの「ライブラリー」タブが開きますので、右側の「外部JARの追加」ボタンをクリックして、ダウンロードしたjarファイルを追加します。

次に、左側のリストから「デプロイメント・アセンブリー」を選択します。右側の「追加」ボタンをクリックするとダイアログが開くので、「Javaビルド・パス・エントリー」が選択された状態で「次へ」ボタンをクリックして、表示されているjarファイルを選択して「完了」ボタンをクリックします。

プロジェクトの設定は以上です。

サンプルプログラム(データの登録)

セッションスコープ」のサンプルプログラムを利用して、入力フォームの値をDBに保存するサンプルを作成します。

画面の流れは、変更はありません。「確認画面」で「進む」を選択すると、「DBに保存」の処理を行い、「完了画面」に移ります。

「入力フォーム」 ⇒ 「確認画面」 ⇒ (「DBに保存」→「完了画面」)

対応するプログラムのファイルは以下のようになります。

[form.jsp]
 ⇒ (( [MainServlet.java] ↔ [UserInfo.java] )→ [confirm.jsp] )
 ⇒ (( [MainServlet.java] ↔ [DbManager.java] )→ [done.jsp] )

プロジェクト名、パッケージ名は、以下のようにしています。

プロジェクト名:SessionTest
パッケージ名:com.test.session

【M】JavaBeans(UserInfo.java

セッションスコープ」のサンプルプログラムと同じです。

DBに接続、データを保存(DbManager.java

新規にクラスを作成します。(最初に作成した)DBに接続して、SQL(ここでではINSERT文)を実行します。

package com.test.session;

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

public class DbManager {
    
    public void InsertUserInfo(UserInfo userInfo) {
        final String DSN = "jdbc:mysql://localhost/db_sa2_sample?characterEncoding=utf8";
        final String USER = "root";
        final String PASSWORD = "";
        
        Connection conn = null;
        try {
            // JDBCドライバのロード
            Class.forName("com.mysql.jdbc.Driver");
            
            // DBに接続
            conn = DriverManager.getConnection(DSN, USER, PASSWORD);
            
            // SQL
            String sql = "INSERT INTO tbl_sa2_sample (name, hobby) values (?, ?)";
            PreparedStatement pStmt = conn.prepareStatement(sql);
            pStmt.setString(1, userInfo.getName());
            pStmt.setString(2, userInfo.getHobby());
            
            // 実行
            int num = pStmt.executeUpdate();
            
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // DBを切断
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

jarファイルのバージョンによっては、プログラムも変わってきます。「mysql-connector-java-8.0.xx.jar」を使用した場合、該当の箇所について、それぞれ以下のように書き換えてください。

   final String DSN = "jdbc:mysql://localhost:3306/db_sa2_sample?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B9:00&rewriteBatchedStatements=true";
   // JDBCドライバのロード
    Class.forName("com.mysql.cj.jdbc.Driver");

【V】JSP(form.jsp

セッションスコープ」のサンプルプログラムと同じです。

【V】JSP(confirm.jsp

セッションスコープ」のサンプルプログラムと同じです。

【V】JSP(done.jsp

セッションスコープのサンプルプログラムを利用していますのでJSPファイルですが、データの読み込みは行っていないのでHTMLファイルでも構いません。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>完了画面</title>
</head>
<body>
    <p>登録が完了しました。</p>

    <a href="/SessionTest/MainServlet">戻る</a>
</body>
</html>

【C】サーブレット(MainServlet.java

doGetメソッドにて、パラメータが「action=done」の場合に、セッションスコープに保存された情報をDBに保存する処理を追加します。その後、不要となったセッションスコープ内のインスタンスを削除して、完了画面に移動します。

@WebServlet("/MainServlet")
public class MainServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public MainServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");

        // フォワード先
        String strForwardPath = null;
        
        String strAction = request.getParameter("action");

        if (strAction == null) {
            // フォワード先を設定(入力フォーム)
            strForwardPath = "/form.jsp";
            
        } else if (strAction.equals("done")) {
            // セッションスコープに保存された情報
            HttpSession session = request.getSession();
            UserInfo userInfo = (UserInfo) session.getAttribute("user_info");
            
            // DBに保存
            DbManager dbManager = new DbManager();
            dbManager.InsertUserInfo(userInfo);
            
            // 不要となったセッションスコープ内のインスタンスを削除
            session.removeAttribute("user_info");

            // 登録後のフォワード先を設定(完了画面)
            strForwardPath = "/done.jsp";
        }
        
        // 設定されたフォワード先にフォワード
        RequestDispatcher dispatcher = request.getRequestDispatcher(strForwardPath);
        dispatcher.forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        
        String strName = request.getParameter("name");
        String strHobby = request.getParameter("hobby");
        
        // UserInfoクラス(JavaBeans)
        UserInfo userInfo = new UserInfo();
        userInfo.setName(strName);
        userInfo.setHobby(strHobby);

        // セッションスコープに保存
        HttpSession session = request.getSession();
        session.setAttribute("user_info", userInfo);

        // フォワード(確認画面)
        RequestDispatcher dispatcher = request.getRequestDispatcher("/confirm.jsp");
        dispatcher.forward(request, response);
    }
}

実行

「MainServlet.java」を実行します。完了画面に進んだとき、入力した値がDBに保存されていることを確認してください。


サンプルプログラム(データの取得)

DBに接続、データの読み込み(DbManager.java

DbManager.java に以下のメソッドを追加します。

   public ArrayList<UserInfo> getUserInfo() {
        
        final String DSN = "jdbc:mysql://localhost/db_sa2_sample?characterEncoding=utf8";
        final String USER = "root";
        final String PASSWORD = "";
        
        ArrayList<UserInfo> arUserInfo = new ArrayList();
        
        Connection conn = null;
        try {
            // JDBC ドライバのロード
            Class.forName("com.mysql.jdbc.Driver");
            
            // データベースへ接続
            conn = DriverManager.getConnection(DSN, USER, PASSWORD);
            
            // SQL
            String sql = "SELECT * FROM tbl_sa2_sample";
            PreparedStatement pStmt = conn.prepareStatement(sql);
            // 実行
            ResultSet rs = pStmt.executeQuery();
            
            // 結果表に格納されたレコードの内容を表示
            while (rs.next()) {
                String name = rs.getString("name");
                String hobby = rs.getString("hobby");
                
                UserInfo userInfo = new UserInfo();
                userInfo.setName(name);
                userInfo.setHobby(hobby);
                
                arUserInfo.add(userInfo);
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // データベース切断
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        
        return arUserInfo;
    }   

【C】サーブレット(ShowDataServlet.java

新規にサーブレットクラスを作成します。

package com.test.session;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ShowDataServlet")
public class ShowDataServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public ShowDataServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 文字コードをセット(日本語の文字化けを避ける)
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        
        // UserInfoクラス(JavaBeans)
        DbManager dbManager = new DbManager();
        // DBの全データを取得
        ArrayList<UserInfo> arUserInfo = dbManager.getUserInfo();
        
        PrintWriter out = response.getWriter();
        for (int i = 0; i < arUserInfo.size(); i++) {
            UserInfo userInfo = arUserInfo.get(i);
            out.println(userInfo.getName() + " " + userInfo.getHobby() + "<br>");
        }
    }

}

実行

「ShowDataServlet.java」を実行します。