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
へのアクセス権限のみを付与する手順は以下の通りです。
-
- 「test」ユーザーを作成します。
CREATE USER 'test'@'localhost' IDENTIFIED BY 'パスワード';
- 「test」ユーザーに
ankisys_test
へのアクセス権限を付与します。GRANT ALL PRIVILEGES ON ankisys_test.* TO 'test'@'localhost';
これで、「test」ユーザーは
ankisys_test
データベースのみにアクセスできるようになりました。
- 「test」ユーザーを作成します。
課題3
ankisys_db
のデータを ankisys_test
にコピーしてみましょう。方法がわからない場合は、調べながら試してみてください!
ヒント:「MySQLのデータ移行には INSERT INTO … SELECT
や mysqldump
コマンドを使う方法があります。」
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(コマンドプロンプト上での実施になります)
ankisys_db
のデータをSQLファイルにエクスポートします。mysqldump -u ユーザー名 -p ankisys_db > anki_db.sql
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ドライバをインストールしましょう。
今回は MySQL Connector/J という JDBC ドライバを使用します。
以下の公式サイトからダウンロードできます:
🔗 MySQL Connector/J ダウンロードページ
- Select Platformで「Platform Independent」を選択
- Platform Independent (Architecture Independent), ZIP Archiveをダウンロード
ダウンロードした 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&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&characterEncoding=UTF-8 を指定し、タイムゾーンと文字化け対策を実施
2.JNDI名について
JNDI (Java Naming and Directory Interface) は、アプリケーションからデータベースを特定するための 識別子 です。
JNDI 名を設定する際のポイントは以下の通りです。
✅ 自分で決める名称 (一般的に jdbc/
で始める)
✅ context.xml
に記述し、データソースの詳細を定義
✅ web.xml
に登録し、アプリがデータソースを利用できるようにする
3.web.xmlファイルの更新
web.xml
に JNDI データソースの参照設定 を追加します。
ファイルの場所: 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.xml
のname
と 一致 させる (例:jdbc/memoapp_db
)
これで JDBC を使った MySQL への接続設定 は完了です!
次は Java コードからデータベースに接続 し、実際にデータのやり取りを行いましょう。 🚀
プログラミングで接続を確立:Connection オブジェクトを取得
それでは実際にプログラムに実装していきましょう。
すべてのコードを表示すると説明が長くなるのでポイントだけを掻い摘んで説明します。
まず、以下のようにDataSourceを宣言します。
@Resource(name="jdbc/ankisys_db") private DataSource dataSource;
処理の説明
@Resource(name="jdbc/ankisys_db")
は、web.xml
やcontext.xml
で設定したJNDI名を参照するための宣言です。private DataSource dataSource;
でDataSource
型の変数dataSource
を定義します。
DataSource型は初期状態では「型が特定できません」のエラーが表示されることがあります。こちらはプロジェクトに適切なライブラリが追加されていため発生するので、下図の通り、コードの左側に表示されるアイコンをクリックし「javax.sqlのインストール」を選択します。
画面上部のインストールされているプログラムの一覧に
import javax.sql.DataSource;
が入っていれば大丈夫です。
次に、実際のプログラムを記述します。
以下のコードは loginServlet.java
に記述し、 account_master
テーブルから UserId
と PassWord
を取得します。
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()
ではなく 適切なエラーハンドリング を行うことが推奨されます。エラーハンドリングの詳細については、別講義で解説します。
プログラムを実行し、デバッグ結果に "データベース接続成功!"
と表示されればOKです。
これでデータベースの接続が実装されました!
次回の講義では、取得したデータを基に 認証処理 を実装し、MVCデザインパターンについても解説します。
「記事の更新を待てない!」「すぐに動画で学びたい!」という方には、Udemyでの学習がおすすめです。
私自身も利用して、基礎から応用までしっかりと学べたので、非常に助かりました!ぜひ一度チェックしてみてください。
Udemyについての詳しい記事はこちらをご参照ください。