はじめに
こんにちは。
プログラミング初心者wakinozaと申します。
勉強中に調べたことを記事にまとめています。
十分気をつけて執筆していますが、なにぶん初心者が書いた記事なので、理解が浅い点などあるかと思います。
間違い等あれば、指摘いただけると助かります。
記事を参考にされる方は、初心者の記事であることを念頭において、お読みいただけると幸いです。
記事のテーマ
- Windows11で、MySQLの環境を構築したので、備忘録として手順をまとめていきます
- 今回は、Eclipseの動的WebプロジェクトでMySQLを用いたログイン認証処理を作成するという想定で、環境構築の手順を説明していきます
- 言語は、Java(Servlet)。 Eclipse(Pleiades)とJDKは、インストール済みという想定です
動作環境
- Windows11
- Oracle Java 21
- eclipse 2025-09 (pleiades)
- MySQL 8.4.6
目次
1. MySQLのダウンロード
2. テーブルの作成
3. 作業用ユーザーの作成
4. MySQL Connector/J(JDBCドライバ)の導入
5. DB接続設定をcontext.xmlに記述
6. MySQLを利用するDAOクラス
1. MySQLのダウンロード
1-1. MySQLのインストール
まずは、MySQLをダウンロードします。
上の公式サイトからインストールする方法もありますが、wingetでインストールすることも可能です。
winget(Windows Package Manager) は、ソフトウェアをインストール・更新・削除するためのコマンドラインツールです。
アプリを「検索 → ダウンロード → インストール」まで一括で自動化できます。
Microsoft社が提供していて、Windows 11 の多くに標準で搭載されています。
wingetでMySQLをインストールする場合は、PowerShellで以下のコマンドを実行します。
winget install --id Oracle.MySQL -e
「--id パッケージID」でインストールするパッケージIDを指定します。
「-e」は、指定したIDと完全に一致するものだけをインストールするよう制限するオプションであり、似た名前のパッケージや、なりすましパッケージのインストールを防ぎます。
1-2. MySQLの動作設定
インストール後に「MySQL. 8.4 Configurator」を開いて、動作環境などを設定します。
「Accounts and Roles」で設定するパスワードは非常に重要なので、強度の高いパスワードを設定し、必ず記録しておきましょう。
特にこだわりがなければ、そのほかの項目はデフォルトで問題ありません。
これで、MySQLのインストールと設定は完了です。
1-3. 環境変数パスの設定
インストールは完了しましたが、まだパスが通っていないため、 この時点ではコマンドからの操作ができません。
そのため、まず環境設定のパスを通します。
[GUIで操作するには]
- MySQLがどのディレクトリにインストールされたのかの確認します。windowsの場合は、以下の場所にあることが多いです。
C:\Program Files\MySQL\MySQL Server バージョン番号\bin
C:\Program Files\MySQL\MySQL Server バージョン番号\bin のフォルダが見つかったら、「bin」フォルダのパスをコピーしておきます。
- Windowsキー →「環境変数」と検索 →「システム環境変数の編集」を開く
- 「環境変数(N)…」ボタンを押す
- 上側の「ユーザー環境変数」の中から「Path」を選択 →「編集」
- 「新規」を押して、先ほどコピーした MySQL の「bin」のパスを貼る
- 「OK」を押して全部閉じる
[パスが通ったかを確認]
PowerShellをいったん閉じて、開きなおし、ターミナルに新しい環境変数の設定を反映させます。その上で、以下のコマンドを実行します。
mysql --version
これでコマンドが正常に実行され、バージョン情報が表示されれば、パスが無事通っています。
2. テーブルの作成
MySQLの操作は「MySQLコマンドラインクライアント」で行います。「mySQLコマンドラインクライアント」は、SQL文を実行するために作られた専用のプログラムです。
2-1. MySQLコマンドラインクライアントでログイン
初回ログインは、MySQLの動作設定の時に作成した「rootユーザー」でログインします。
PowerShellで以下のコマンドを実行します。
mysql -u root -p
その後に出るパスワード入力欄にrootユーザーのパスワードを入力します。
コピーライト情報やバージョン情報が表示されれば、無事ログインできています。
「mysql -u root -p」の方法とは別に、パスワードをコマンドライン上で入力する方法もあります。しかし、その場合は履歴にパスワードの文字列が残ってしまうため、セキュリティ上の問題からコマンドライン上でのパスワードの入力は非推奨となっています。
以下は非推奨のパスワード入力方法(パスワードがpassの場合)
mysql -u root -p pass
無事ログインできた場合は2-3へ、ログインできなかった場合は2‐2へ進んでください。
2-2. MySQLを手動で起動する方法
MySQLにログインする際には、MySQLサーバーが起動している必要があります。
動作設定時に「パソコン起動にMySQLを起動する」設定をONにしていれば、通常パソコンの起動時にMySQLサーバーも自動的に起動します。
しかし、自動起動設定をONにしていない場合は、MySQLサーバーを手動で起動する必要があります。サーバーが起動していない状態では、ログインコマンドを実行しても失敗します。
MySQLを手動で起動するには、PowerShellの管理者権限でサーバーのサービスを起動します。
まずは、Windows環境でのMySQLの「サービス名」を確認します。
PowerShellで以下のコマンドを実行します。
Get-Service | Where-Object { $_.DisplayName -like "*MySQL*" }
すると、例として以下のような表示が出ます。
Status Name DisplayName
------ ---- -----------
Stopped MySQL80 MySQL 8.0
Nameの下に書かれているのが、MySQLのWindowsのサービス名です。サービス名は環境によって異なります。
次に、PowerShellを管理者権限で起動します。
- スタートメニューを開く
- 「PowerShell」と入力する
- WindowsPowerShellを右クリックする
- 「管理者として実行」をクリックする
PowerShellのウィンドウの上部に「管理者(Administrator):」と表示されていれば、管理者としてPowerShellを開いている状態になります。
その次に、管理者権限のPowerShellに以下のコマンドを実行し、MySQLサーバーを起動します。
net start サービス名
「サービスは正常に開始されました」という文言が出れば、無事MySQLは起動できたことになります。
その後、2-1のログインを再度行います。
2-3. データベースの新規作成
ログインが完了したら、データベースとテーブルを作成します。
まずは、データベースを作成します。
「CREATE DATABASE」の命令文の後に、任意のデータベース名(例として「test_db」とします)を指定します。
CREATE DATABASE test_db;
2-4. テーブルの新規作成
次にデータを格納するテーブルを作成します。
まずは、テーブルを格納するデータベースを選択します。
USE test_db;
次にテーブルを作成します。
ここではユーザーの情報を格納する簡単なテーブル(例として「users」とします)を作成します。
本来パスワードは不可逆なハッシュ関数(例: Argon2, bcrypt)を用いてハッシュ化して格納すべきですが、この記事では手順の簡略化のため平文で扱います。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL
);
作成したテーブルの構造を確認する場合は、コマンドを実行します。
DESCRIBE users;
2-5. データの追加
作成したテーブルにデータを追加します。
INSERT INTO users (name, password)
VALUES ('taro', 'password');
追加したデータが正しく格納されているか確認するには、以下のコマンドを実行します。
SELECT * FROM users;
これでテーブルの作成は完了です。
3. 作業用ユーザーの作成
これまでの作業はrootユーザーで行ってきました。
rootユーザーはすべての権限を持つ管理者であるため、どのような操作も可能です。
しかし、実務においては権限が強すぎると、誤動作やSQLインジェクション攻撃を受けた際の被害が大きくなるというリスクがあります。
そのため、実際の作業時には必要最低限の権限だけを持つ「作業用ユーザー」を作成して利用します
rootユーザーは、いわば「マスターキー」のようなものなので、非常用として温存し、普段は利用しないのが原則です。
どのような権限を持つ作業用ユーザーを作るかは、プロジェクトによって様々です。
ここでは、指定したデータベースのテーブル情報を取得できる作業用ユーザーを作成します。
まずは、作業用ユーザーを作成し、パスワードを設定します。
CREATE USER my_user@'localhost' IDENTIFIED BY 'password';
- [CREATE USER my_user@'localhost']で「my_user」というユーザー名を、localhost(=このパソコンからのみ)接続できるユーザーとして作成します。
- [IDENTIFIED BY 'password'] で、ユーザーのパスワードを'password'として設定します。
続いて、先ほど作成したユーザーに権限を付与します。
GRANT SELECT ON test_db.* TO my_user@localhost;
- [GRANT SELECT]で、SELECTを行う権限のみを付与します。
- [ON test_db.* TO my_user@localhost;]で、権限の対象範囲を指定します。ここでは、my_userというユーザーがlocalhostから接続した場合において、'test_db'というデータベースのすべてのテーブルに対して、という意味です。
次に、権限の変更をMySQLに読み込ませます。
FLUSH PRIVILEGES;
作業用ユーザーでログインしなおす場合は、一度rootユーザーをログアウトします。
exit;
そのうえで、作業用ユーザーとしてログインします。
mysql -u my_user -p
4. MySQL Connector/J(JDBCドライバ)の導入
次にプログラム側の設定を行います。
Eclipseの動的Webプロジェクトで開発を行っているという前提で説明します。
4-1. 「JDBC API」と「JDBCドライバ」
Javaプログラムは、標準の「JDBC API」のインターフェースを介して、「JDBCドライバ」の実装をクラスを利用します。ドライバがDBMSとの通信(プロトコル変換)を行うことでデータベース操作を実現します。
「JDBC API」は java.sql モジュールにて標準で提供されています。
一方、「JDBCドライバ」は使用したいDBMSベンダーが提供しているものを取得する必要があります。
4-2. Connectorのダウンロードと設置方法
MySQLを利用する場合は、公式サイトの「MySQL Community Downloads」のページから「JDBCドライバ」を入手します。
MySQLのjava言語用「JDBCドライバ」は、「Connector/J」と呼ばれるJARファイルです。
- 公式サイトのダウンロードページへ
- 「Connector/J」のページへ
- 最新のバージョンが表示されていると思いますので、「Select Operating System」で「Platform Independent(OSに依存しない)」を選択します。(MySQL Server のバージョン番号とConnectorのバージョン番号は一致させる必要はありません。最新版をダウンロードすることをおすすめします)
- TARとZIPと2種類の圧縮形式があるので、お使いのアーカイブソフトにあった形式を選択し(WindowsならZIP)、「Download」ボタンをクリックします。どちらの圧縮形式を選択しても、解凍後のフォルダ内に含まれている「JDBCドライバ」のJARファイル自体は同じものです。
- 「Begin Your Download」の画面に切り替わったら、Oracle Web accountにログインするか、「No thanks,just start my download」をクリックして、ダウンロードします。
- ダウンロードした圧縮ファイルを解凍すると「mysql-connector-j-バージョン番号.jar」というJARファイルが見つかります。これが、「JDBCドライバ」のJARファイルです。
- WebアプリケーションでMySQLを利用できるようにするには、「mysql-connector-j-バージョン番号.jar」をEclipseのビルドパスに認識される必要があります。Eclipseの動的プロジェクト(Tomcat)で開発を行っている場合は、「/WebContent/WEB-INF/lib」配下に「mysql-connector-j-バージョン番号.jar」をドラッグ&ドロップするだけで、自動的にビルドパスが通ります。
これで「JDBCドライバ」の設定が完了しました。
5. DB接続設定をcontext.xmlに記述
次に、DB接続情報を記述していきます。
「DB接続情報」とは、DBのURL、作業用ユーザーのユーザー名、パスワードなどを指します。
これらの情報は、アプリケーションでDBを利用するうえで必要不可欠な情報です。
DB接続情報は、アプリケーションのソースコード中に記述することもできますが、context.xmlファイルに記載することが望ましいです。
context.xmlファイルとは、アプリケーションを実行するために必要なコンテナレベルの設定を定義するファイルです。リソース定義やセッション管理などの情報を記載します。
DB接続情報をソースコードではなく、context.xmlファイルに記述することで以下のメリットが期待できます。
- 環境依存情報の分離:DB接続情報は、開発環境や本番環境などによって異なります。DB接続情報をcontext.xmlに記述することで、環境が変わるたびにソースコードを修正する必要がなくなり、柔軟なデプロイが可能になります。
- コンテナにライフサイクル管理を任せる:DB接続情報をcontext.xmlに記述することで、DB接続管理タスクをサーブレットコンテナに任せ、開発者はビジネスロジックの開発に集中することができます。
- コネクションプーリングの利用:DBの接続と切断は非常にコストがかかる処理です。しかし、コンテナにDB接続管理を任せることで、コネクションプーリングという仕組みを利用できます。コネクションプーリングとは、事前に接続を作成・保持しておき、必要なときに接続を利用して、不要になったら接続をプールに返すという仕組みです。これにより、DB接続処理のオーバーヘッドが抑制され、パフォーマンスが向上します。
Eclipse の動的 Web プロジェクトでは、WebContent/META-INF/context.xml に配置するとデプロイ時に自動で Tomcat の設定として登録されます。
META-INFフォルダとは、アプリケーションをデプロイ・実行するために必要な、「設定ファイル」や「定義ファイル」などのメタ情報を格納するために用意されたフォルダです。ブラウザからのMETA-INFフォルダへのアクセスはデフォルトで禁止されているため、機密性の高い情報が外部に公開されるのを防ぎます。
<?xml version="1.0" encoding="UTF-8" ?>
<Context>
<Resource
name="jdbc/test_db"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test_db"
username="my_user"
password="password"
/>
</Context>
Resource要素の属性として、DB接続情報を指定します。
それぞれの属性の説明は以下の通りです。
| 属性 | 概要 |
|---|---|
| name | データソースを一意に識別する名前。先の2-3章で作成したデータベース名を指定する。例:jdbc/データベース名 |
| auth | リソースの制御方法。「Container」と指定する。 |
| type | リソースのデータ型。「jakarta.sql.DataSource」と指定する。 |
| driverClassName | JDBCドライバクラスの完全修飾名。 MySQLは「com.mysql.cj.jdbc.Driver」と指定する。 |
| url | 接続文字列(接続するデータベースによりURLフォーマットが異なる)。 MySQLは「jdbc:mysql://サーバー名:ポート番号/データベース名」と指定する。 |
| username | 接続時に使用する作業用ユーザーのユーザー名。 |
| password | 作業用ユーザーのパスワード。 |
6. MySQLを利用するDAOクラス
ここまでで、アプリケーションから MySQL を利用するための準備が整いました。
次に、Java(Servlet)で MySQL を利用してログイン認証を行うための DAO(Data Access Object)クラスを作成していきます。
DAO パターンを採用することで、DB との物理的なやり取りをロジックからビジネスロジックから切り離し、責務を分離できます。
今回の MVC 構成は以下の通りです。
Model(User):ログインユーザー情報を保持するクラス
View(index.jsp):ログインフォーム
Controller(Login サーブレット):認証処理を受け取り、DAO を呼び出す
DAO(DAO / UserDAO):DB 接続および users テーブルの操作を担当
まず、User情報を保持するbeanを作成します。
import java.io.Serializable;
/**
* . ユーザー情報を保持するクラス
*/
public class User implements Serializable {
private int id;
private String name;
private String pass;
public User() {}
public User(int id, String name, String pass) {
this.id = id;
this.name = name;
this.pass = pass;
}
public int getId() {
return this.id;
}
public String getName() {
return this.name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
次に、DataSource を取得するための DAO 基底クラスを作成します。
import java.sql.Connection;
import javax.naming.InitialContext;
import javax.sql.DataSource;
/** . DB接続をつかさどるクラス */
public class DAO {
static DataSource ds;
public Connection getConnection() throws Exception {
if (ds == null) {
InitialContext ic = new InitialContext();
ds = (DataSource) ic.lookup("java:comp/env/jdbc/test_db");
}
return ds.getConnection();
}
}
DAO 基底クラスを継承し、userテーブルの操作を行うUserDAOクラスを作成します。実務のエラー処理では、ロギングライブラリ(例: SLF4J + Logback)を使用してエラーレベルで記録し、ユーザーには適切なエラーメッセージを返す必要がありますが、この記事では簡潔に説明するために省略しています。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.example.bean.User;
/** . usersテーブルの操作を行うDAOクラス */
public class UserDAO extends DAO {
public User select(String name, String pass) {
User user = null;
try (Connection con = getConnection()) {
PreparedStatement st =
con.prepareStatement("SELECT id, name FROM users WHERE name=? AND password=?");
st.setString(1, name);
st.setString(2, pass);
try (ResultSet rs = st.executeQuery()) {
if (rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
}
}
}catch (SQLException | NamingException e) {
// 実務ではLoggerを使用するが、ここでは簡略化のためRTEでラップする
throw new IllegalStateException("Database access failed", e);
}
return user;
}
}
ログイン処理のうち、ビジネスロジックは、LoginLogicクラスとして定義します。これにより、DB操作とビジネスロジック分離できます。
import com.example.bean.User;
import com.example.dao.UserDAO;
/** . ログイン処理を行うビジネスクラス */
public class LoginLogic {
public User search(String name, String pass) {
UserDAO userDao = new UserDAO();
return userDao.select(name, pass);
}
}
ログインフォームを表示するjspファイルを作成します。
<!--/ログイン画面を表示するjspファイル-->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログインページ</title>
</head>
<body>
<h1>ログイン</h1>
<form action="Login" method="post">
ユーザー名:<input type="text" name="name"><br>
パスワード:<input type="password" name="pass"><br>
<input type="submit" value="ログイン">
</form>
</body>
</html>
最後に、ログイン認証を実行するコントローラーであるサーブレットクラスを作成します。
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import com.example.bean.User;
import com.example.model.LoginLogic;
/**
* . ログイン処理するサーブレットクラス
*/
@WebServlet("/Login")
public class Login extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String pass = request.getParameter("pass");
LoginLogic loginLogic = new LoginLogic();
User loginUser = loginLogic.search(name, pass);
if (loginUser == null) {
request.getRequestDispatcher("WEB-INF/jsp/LoginError.jsp").forward(request, response);
} else {
HttpSession session = request.getSession();
session.setAttribute("loginUser", loginUser);
request.getRequestDispatcher("WEB-INF/jsp/loginResult.jsp").forward(request, response);
}
}
}
実際の認証処理の流れは以下の通りです。
-
ユーザーが index.jsp のログインフォームから name と password を送信
-
Login サーブレットがUserDAO入力情報を受け取り、LoginLogic クラスを経由してUserDAO を呼び出す
-
UserDAO が DBに問い合わせる
-
一致するユーザーがいれば User インスタンスを返す。一致しなければ null を返す
-
サーブレットでログイン成功・失敗を判定し、成功すれば次の画面(LoginResult.jsp コードは省略)へ、失敗すればエラー画面(LoginError.jsp コードは省略)へ遷移する
記事は以上です。
最後までお読みいただき、ありがとうございました。
参考情報一覧
この記事は以下の情報を参考にして執筆しました。
- [スッキリわかるSQL入門 第3版]
- [MySQL徹底入門 第5版]
- [基礎からのサーブレット/JSP 第5版]
- [徹底攻略 JavaSE11Gold問題集]
- MySQL 8.0 リファレンスマニュアル (参照:2025/12/8)
- MySQL Community サーバ のインストール,データベース作成,テーブル定義とレコード挿入,各種設定(Windows 上) (参照:2025/12/8)