【Webシステム開発講座】JDBCでWebシステムとMySQLを接続しよう

Webシステム開発講座へようこそ!

前回の記事で MySQLの基本設定 を完了しました。今回は JDBC を使って WebシステムとMySQLの接続処理 を実装していきます。

本記事で学べること

JDBCの基本知識:JDBCとは何か、どのように動作するのか
具体的な手順:JDBCを使ってMySQLに接続する方法

この記事は次のような方におすすめ!

💡 初めてデータベースを操作する方
💡 データベース接続の仕組みを理解したい方
💡 JavaとMySQLの連携を学びたい方

事前準備

この記事を進める前に、前回の記事で解説した「MySQLにユーザーアカウントとデータベースを作ろう!」を確認しておきましょう。まだの方は、以下からご覧いただけます。

前回の課題の回答

課題1

新しくテスト用のデータベースを作成しましょう。
作成するデータベース名は ankisys_test とします。

前回の記事で解説したデータベース作成の手順を応用するだけです。以下のSQLコマンドを実行することで、ankisys_test データベースを作成できます。

課題2

ankisys_test だけにログインできる「test」ユーザーを作成しましょう。

ankisys_test 専用の「test」ユーザーを作成し、ankisys_test へのアクセス権限のみを付与する手順は以下の通りです。

    1. 「test」ユーザーを作成します。
      CREATE USER 'test'@'localhost' IDENTIFIED BY 'パスワード';
    2. 「test」ユーザーに ankisys_test へのアクセス権限を付与します。
      GRANT ALL PRIVILEGES ON ankisys_test.* TO 'test'@'localhost';

      これで、「test」ユーザーは ankisys_test データベースのみにアクセスできるようになりました。

課題3

今回作成した ankisys_db のデータを ankisys_test にコピーしてみましょう。
方法がわからない場合は、調べながら試してみてください!

ヒント:「MySQLのデータ移行には INSERT INTO … SELECTmysqldump コマンドを使う方法があります。」

MySQLのデータ移行に関する知識が必要になります。ここでは、代表的な2つの方法を紹介します。

方法1:INSERT INTO … SELECT を使う

この方法は、ankisys_db のテーブル構造が ankisys_test と同じ場合に有効です。以下のSQLコマンドを実行することで、ankisys_db のデータを ankisys_test にコピーできます。

INSERT INTO ankisys_test.テーブル名 SELECT * FROM ankisys_db.テーブル名;/* Your code... */

方法2:mysqldump コマンドを使う

この方法は、ankisys_db のデータをSQLファイルとしてエクスポートし、それを ankisys_test にインポートする方法です。テーブル構造が異なる場合でも使用できます。※Bash(コマンドプロンプト上での実施になります)

  1. ankisys_db のデータをSQLファイルにエクスポートします。
    mysqldump -u ユーザー名 -p ankisys_db > anki_db.sql
  2. ankisys_test にSQLファイルをインポートします。
    mysql -u ユーザー名 -p ankisys_test < anki_db.sql

方法1と2どちらを利用しても大丈夫ですが、それぞれの特徴を理解して使い分けるとよいです。

方法1の特徴

  • テーブル単位でのデータ移行に適している。
  • 移行元のテーブルと移行先のテーブルの構造が同じである必要がある。
  • 特定の条件でデータを抽出して移行する場合にも使用できる。

方法2の特徴

  • データベース全体の移行に適している。
  • テーブル構造が異なる場合でも使用できる。
  • データベースのバックアップとしても使用できる。

JDBCとは?

JDBC(Java Database Connectivity)は、Javaプログラムからデータベースにアクセスするための標準API です。
JDBCドライバは、Javaプログラムとデータベースの橋渡しを行い、JARファイル の形で提供されます。
JDBCを利用することで、Javaプログラムは様々なデータベースに簡単に接続できます。

JDBCのメリット

様々なデータベースに対応
JDBCは、MySQL、PostgreSQL、Oracleなど、多くのデータベースに対応しています。
データベースを変更する際も、JDBCドライバを切り替えるだけで対応可能 です。

標準的なAPIで学習コストが低い
JDBCはJavaの標準APIとして提供されており、多くのJava開発者が利用方法を知っています。
また、情報が豊富で、学習コストが低いのも利点です。

データベース接続の抽象化
JDBCを利用すると、プログラムはデータベースの種類を意識せず、統一されたAPI で操作できます。
これにより、アプリケーションの可搬性(ポータビリティ)が向上します。

JDBCドライバの準備:接続先DBに合わせて選択&インストール

WebシステムからMySQLに接続するために、JDBCドライバをインストールしましょう。

STEP.1
公式サイトよりJDBCドライバのインストール

今回は MySQL Connector/J という JDBC ドライバを使用します。
以下の公式サイトからダウンロードできます:
🔗 MySQL Connector/J ダウンロードページ

  • Select PlatformでPlatform Independent」を選択
  • Platform Independent (Architecture Independent), ZIP Archiveをダウンロード
STEP.2
JDBCドライバをプロジェクトに追加

ダウンロードした ZIP ファイルを解凍すると、フォルダ内に mysql-connector-j-9.2.0.jar というファイルがあります。

この .jar ファイルを以下の場所に配置してください
📂 WEB-INF/lib/ フォルダ内

これで JDBC ドライバの準備は完了です!次は Java から MySQL に接続するコードを実装していきましょう。

 DB接続情報を設定:URL、ユーザー名、パスワードを指定

JDBC を利用して MySQL に接続するために、接続情報を設定しましょう。
Tomcat の JNDI Datasource を利用し、データソースの設定を行います。

1. context.xml の作成・設定

接続用の設定ファイル context.xml を作成し、以下のように記述します。
このフォーマットは Apache Tomcat 8 – JNDI Datasource HOW-TO“MySQL DBCP Example” に基づいています。

<Context>
    <Resource
        name="jdbc/ankisys_db" 
        auth="Container"
        type="javax.sql.DataSource"
        maxTotal="100"
        maxIdle="30"
        maxWaitMillis="10000"
        username="test"
        password="testAdm"
        driverClassName="com.mysql.cj.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/ankisys_db?serverTimezone=UTC&amp;characterEncoding=UTF-8" />
</Context>

🔧 設定変更のポイント
自分のプロジェクトに合わせて、以下の値を変更してください。

  • JNDI名 (name): jdbc/ankisys_db (アプリからデータベースを識別するための名称)
  • ユーザー名 (username) / パスワード (password): test / testAdm (MySQL の接続情報)
  • JDBC ドライバ (driverClassName): com.mysql.cj.jdbc.Driver (MySQL Connector/J 8.0 以降対応)
  • JDBC URL (url): <code”>serverTimezone=UTC&amp;characterEncoding=UTF-8 を指定し、タイムゾーンと文字化け対策を実施

2.JNDI名について

JNDI (Java Naming and Directory Interface) は、アプリケーションからデータベースを特定するための 識別子 です。
JNDI 名を設定する際のポイントは以下の通りです。

自分で決める名称 (一般的に jdbc/ で始める)
context.xml に記述し、データソースの詳細を定義
web.xml に登録し、アプリがデータソースを利用できるようにする

3.web.xmlファイルの更新

web.xmlJNDI データソースの参照設定 を追加します。

ファイルの場所: WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>AnkiSystem</display-name>
  
  <!-- JNDI データソースの定義 -->
  <resource-ref>
    <description>MySQL DataSource</description>
    <res-ref-name>jdbc/ankisys_db</res-ref-name> <!-- JNDI名 (context.xml と一致させる) -->
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
</web-app>

設定変更のポイント

  • <res-ref-name> の値は context.xmlname一致 させる (例: jdbc/memoapp_db)

これで JDBC を使った MySQL への接続設定 は完了です!
次は Java コードからデータベースに接続 し、実際にデータのやり取りを行いましょう。 🚀

プログラミングで接続を確立:Connection オブジェクトを取得

それでは実際にプログラムに実装していきましょう。
すべてのコードを表示すると説明が長くなるのでポイントだけを掻い摘んで説明します。

STEP.1
DataSourceを宣言する

まず、以下のようにDataSourceを宣言します。

@Resource(name="jdbc/ankisys_db")
private DataSource dataSource;

処理の説明

  • @Resource(name="jdbc/ankisys_db") は、web.xmlcontext.xml で設定したJNDI名を参照するための宣言です。
  • private DataSource dataSource;DataSource 型の変数 dataSource を定義します。

DataSource型は初期状態では「型が特定できません」のエラーが表示されることがあります。こちらはプロジェクトに適切なライブラリが追加されていため発生するので、下図の通り、コードの左側に表示されるアイコンをクリックし「javax.sqlのインストール」を選択します。

画面上部のインストールされているプログラムの一覧に

import javax.sql.DataSource;

が入っていれば大丈夫です。

STEP.2
接続処理を組み込む

次に、実際のプログラムを記述します。
以下のコードは loginServlet.java に記述し、 account_master テーブルから UserIdPassWord を取得します。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ユーザー名をリクエストから取得
    request.setCharacterEncoding("UTF-8");
    String username = request.getParameter("username");
    HttpSession session = request.getSession();

    PrintWriter out = response.getWriter();
    response.setContentType("text/plain");

    try (Connection conn = dataSource.getConnection()) {
        System.out.println("データベース接続成功!");
        // "test"というユーザー名の場合は特別なメッセージを表示
        if(username.equals("test") ) {
            session.setAttribute("loggedInUser", "【試験用画面】");
        }
        else {
            session.setAttribute("loggedInUser", "ようこそ、" + username +"さん!");
        }

        RequestDispatcher dispatcher = request.getRequestDispatcher("/menu.jsp");
        dispatcher.forward(request, response);
    } catch (Exception exc) {
        exc.printStackTrace();
    }
}

ポイント

  • Connection conn = dataSource.getConnection(); でデータベース接続を確立します。
  • try-catch でエラーを回避していますが、本番環境では printStackTrace() ではなく 適切なエラーハンドリング を行うことが推奨されます。エラーハンドリングの詳細については、別講義で解説します。
STEP.3
結果を確認する

プログラムを実行し、デバッグ結果に "データベース接続成功!" と表示されればOKです。


これでデータベースの接続が実装されました!
次回の講義では、取得したデータを基に 認証処理 を実装し、MVCデザインパターンについても解説します。

「記事の更新を待てない!」「すぐに動画で学びたい!」という方には、Udemyでの学習がおすすめです。
私自身も利用して、基礎から応用までしっかりと学べたので、非常に助かりました!ぜひ一度チェックしてみてください。
多彩な講座から自分に合った講座を探そう!

Udemyについての詳しい記事はこちらをご参照ください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。