
サーブレット&JSPの基本|データベースとSQLの基礎
サーバを止めてもデータを残す。Webアプリの情報を守るために、データベースとSQLの基本を身に付けよう
これまで作成してきたWebアプリケーションでは、投稿一覧やログイン中の利用者情報などを、リクエストスコープ、セッションスコープ、アプリケーションスコープに保存してきました。
スコープを使うと、サーブレットからJSPへデータを渡したり、ログイン中の利用者情報を保持したり、複数ユーザーで共有する投稿一覧を管理したりできます。
たとえば、ひとこと広場では、投稿されたひとことをアプリケーションスコープのmessageListに保存しました。これにより、Webアプリケーションが動いている間は、複数の利用者で投稿一覧を共有できました。
しかし、スコープには大きな弱点があります。
それは、サーバを停止したり、Webアプリケーションを再起動したりすると、スコープに保存していたデータが消えてしまうことです。
学習用のアプリケーションであれば、サーバを再起動したら投稿が消える、という動きでも確認には使えます。
しかし、実際の業務システムではそうはいきません。
顧客情報、商品情報、注文履歴、社員情報、投稿内容、問い合わせ内容などは、サーバを止めても残っている必要があります。
そこで利用するのが、データベースです。
データベースを使うと、大量のデータを効率よく保存し、必要なときに検索したり、追加したり、変更したり、削除したりできます。
この記事では、Javaプログラムからデータベースを利用する前提として、データベースの基本、リレーショナルデータベース、DBMS、SQL、主要なSQL文、そして学習で使いやすいH2 Databaseについて解説します。
スコープだけではデータを長く残せない
Webアプリケーションでは、スコープを使ってデータを一時的に保存できます。
ただし、スコープは万能な保存場所ではありません。
特に、アプリケーションスコープに保存したデータは、Webアプリケーションが動いている間だけ利用できます。
サーバを停止すると、アプリケーションスコープに保存していたデータは消えてしまいます。
スコープに保存したデータの特徴
| 保存先 | 主な用途 | データが残る期間 |
|---|---|---|
| リクエストスコープ | 1回の画面表示で使うデータ | 1回のリクエスト中 |
| セッションスコープ | ログイン中の利用者情報など | セッションが続いている間 |
| アプリケーションスコープ | 全ユーザーで共有するデータ | Webアプリケーションが動いている間 |
スコープは、Webアプリケーションの処理中にデータを渡したり共有したりするには便利です。
しかし、サーバの停止後もデータを残す用途には向いていません。
サーバを止めてもデータを残したい場合は、スコープではなく、外部の保存先を使う必要があります。
データを残すための保存先
サーバを停止してもデータを残すには、Webアプリケーションの外側にデータを保存します。
代表的な保存先には、ファイルとデータベースがあります。
データの保存先
| 保存先 | 特徴 |
|---|---|
| ファイル | テキストファイルやCSVファイルなどにデータを保存する |
| データベース | DBMSを使って、大量のデータを整理して保存する |
ファイル保存は、簡単なデータを扱う場合には分かりやすい方法です。
ただし、データが増えたり、検索や更新を頻繁に行ったり、複数の利用者が同時にアクセスしたりする場合は、管理が難しくなります。
業務向けの本格的なWebアプリケーションでは、データの保存先としてデータベースを使うのが一般的です。
データベースを使うことで、大量のデータを整理し、必要なデータを効率よく取り出せます。
図1:スコープ保存とデータベース保存の違い

この図から分かること
スコープは、Webアプリケーションの実行中にデータを扱うための保存領域です。
アプリケーションスコープを使えば、Webアプリケーションが動いている間は全ユーザーでデータを共有できます。
しかし、サーバを停止したり、Webアプリケーションを再起動したりすると、スコープに保存されていたデータは消えてしまいます。
一方、データベースに保存したデータは、Webアプリケーションの実行状態とは別に管理されます。
そのため、サーバを停止しても、データベースに保存されたデータは残ります。
データベースとは
データベースとは、データを整理して保存し、必要に応じて取り出せるようにした仕組みです。
単にデータを置いておくだけではなく、検索、追加、変更、削除などを効率よく行えるように管理します。
業務システムでは、さまざまな情報をデータベースに保存します。
データベースに保存するデータの例
| データ | 内容 |
|---|---|
| 利用者情報 | 利用者ID、名前、メールアドレス、パスワードなど |
| 商品情報 | 商品ID、商品名、価格、在庫数など |
| 注文情報 | 注文番号、注文者、注文日、合計金額など |
| 社員情報 | 社員ID、氏名、年齢、所属部署など |
| 投稿情報 | 投稿ID、投稿者、投稿内容、投稿日時など |
このようなデータを、ただ1つの大きなファイルに書いていくと、必要なデータを探したり更新したりするのが大変になります。
データベースを使うと、データを目的ごとに整理し、効率よく扱えます。
リレーショナルデータベースとは
データベースにはいくつかの種類があります。
その中でも広く使われているのが、リレーショナルデータベースです。
リレーショナルデータベースでは、データをテーブルという表の形で管理します。
テーブルは、行と列で構成されます。
1件分のデータは1行で表し、この1行分のデータをレコードと呼びます。
列は、データの項目を表します。
テーブルの基本
| 用語 | 内容 |
|---|---|
| テーブル | データを表形式で保存する入れ物 |
| レコード | テーブル内の1行分のデータ |
| 列 | ID、名前、価格などのデータ項目 |
| セル | 行と列が交差する1つの値 |
たとえば、商品を管理する商品テーブルでは、ID、NAME、PRICEのような列を用意できます。
商品テーブル
| ID | NAME | PRICE |
|---|---|---|
| 1 | ノート | 150 |
| 2 | ボールペン | 120 |
| 3 | USBメモリ | 1200 |
この表では、1行が1つの商品データを表しています。
IDが1の行は、ノートという商品を表し、価格は150です。
IDが2の行は、ボールペンという商品を表し、価格は120です。
IDが3の行は、USBメモリという商品を表し、価格は1200です。
このように、リレーショナルデータベースでは、データを表として整理して管理します。
データベースはテーブルの集まり
リレーショナルデータベースでは、1つのデータベースの中に複数のテーブルを作成できます。
たとえば、販売管理システムなら、利用者テーブル、商品テーブル、注文テーブルなどを作ります。
データベースとテーブルの関係
| データベース | 含まれるテーブルの例 |
|---|---|
| 販売管理データベース | 利用者テーブル、商品テーブル、注文テーブル |
| 社員管理データベース | 社員テーブル、部署テーブル |
| 投稿管理データベース | 利用者テーブル、投稿テーブル |
データベースは、複数のテーブルをまとめて管理する入れ物です。
テーブルは、同じ種類のデータを表形式で保存する場所です。
この関係を理解しておくと、データベース設計の基本が見えてきます。
図2:リレーショナルデータベースはテーブルでデータを管理する

この図から分かること
リレーショナルデータベースでは、データをテーブルとして管理します。
1つのデータベースの中には、利用者テーブル、商品テーブル、社員テーブルのように、複数のテーブルを作成できます。
テーブルは行と列で構成されます。
1行分のデータをレコードと呼び、列はID、NAME、PRICEのようなデータ項目を表します。
この表形式の管理により、大量のデータを整理して扱えるようになります。
主なデータベース製品
データベースには、商用製品とオープンソース製品があります。
業務システムでは、用途や規模、費用、運用体制に合わせてデータベース製品を選びます。
主なデータベース製品
| 商用 | オープンソース |
|---|---|
| Oracle Database | MySQL |
| Microsoft SQL Server | PostgreSQL |
| IBM Db2 | H2 Database |
商用データベースは、大規模な業務システムで利用されることが多く、サポートや管理機能が充実しています。
オープンソースのデータベースは、学習や開発、小規模から中規模のシステムなどでよく利用されます。
この学習では、H2 Databaseを使います。
H2 DatabaseはJavaで作成されており、JARファイルをクラスパスに追加するだけで利用できます。
導入しやすく、学習用途にも向いています。
DBMSとは
データベースに保存されたデータは、DBMSによって管理されます。
DBMSは、データベース管理システムのことです。
データベースの中にあるデータを直接手作業で操作するのではなく、DBMSに命令を出して、検索、追加、変更、削除を行います。
DBMSの役割
| 役割 | 内容 |
|---|---|
| データの保存 | テーブルにデータを保存する |
| データの検索 | 条件に合うレコードを取り出す |
| データの追加 | 新しいレコードを登録する |
| データの変更 | 既存のレコードの値を更新する |
| データの削除 | 不要なレコードを削除する |
| データの管理 | 安全性や整合性を保ちながら管理する |
DBMSは、利用者やプログラムからの命令を受け取り、データベースの中のデータを操作します。
Javaプログラムからデータベースを使う場合も、Javaが直接テーブルの中身を書き換えるわけではありません。
Javaプログラムは、DBMSに命令を送り、DBMSがデータベースを操作します。
SQLとは
DBMSに命令を出すために使う言語がSQLです。
SQLは、Structured Query Languageの略です。
リレーショナルデータベースを操作するための専用言語です。
SQLを使うと、テーブルからデータを検索したり、新しいデータを追加したり、既存のデータを変更したり、不要なデータを削除したりできます。
SQLでできる主な操作
| 操作 | SQL文 | 内容 |
|---|---|---|
| 検索 | SELECT文 | 条件に合うレコードを取り出す |
| 追加 | INSERT文 | 新しいレコードを追加する |
| 変更 | UPDATE文 | 既存のレコードの値を変更する |
| 削除 | DELETE文 | 不要なレコードを削除する |
これら4つのSQL文は、データベース操作の基本です。
Webアプリケーションからデータベースを利用するときも、これらのSQL文を使ってデータを操作します。
図3:JavaプログラムはSQLでDBMSに命令する

この図から分かること
Javaプログラムは、データベース内のテーブルを直接操作するのではありません。
Javaプログラムは、SQL文を使ってDBMSに命令を送ります。
DBMSは、そのSQL文を受け取り、データベース内のテーブルに対して検索、追加、変更、削除などの処理を行います。
処理結果はDBMSからJavaプログラムへ返され、Javaプログラムはその結果を使ってブラウザに画面を表示します。
SELECT文はレコードを検索する
SELECT文は、テーブルからレコードを検索するためのSQL文です。
たとえば、社員情報を保存しているEMPLOYEESテーブルから、従業員一覧を取得したい場合に使います。
SELECT文の役割
| SQL文 | 役割 |
|---|---|
| SELECT文 | テーブルから条件に合うレコードを検索する |
SELECT文は、Webアプリケーションでとてもよく使います。
一覧画面、詳細画面、検索画面など、データを表示する画面では、多くの場合SELECT文を使ってデータを取り出します。
たとえば、社員一覧を表示する場合は、EMPLOYEESテーブルから社員データを取得し、その結果をJSPで表示します。
INSERT文はレコードを追加する
INSERT文は、テーブルに新しいレコードを追加するためのSQL文です。
たとえば、新しい社員を登録する画面で、入力された社員情報をEMPLOYEESテーブルに保存するときに使います。
INSERT文の役割
| SQL文 | 役割 |
|---|---|
| INSERT文 | テーブルに新しいレコードを追加する |
Webアプリケーションでは、会員登録、商品登録、投稿登録、問い合わせ登録などでINSERT文を使います。
フォームに入力された内容をサーブレットで受け取り、SQLを使ってDBMSに登録を依頼します。
UPDATE文はレコードを変更する
UPDATE文は、既存のレコードの値を変更するためのSQL文です。
たとえば、社員の年齢や名前、所属部署などを変更したい場合に使います。
UPDATE文の役割
| SQL文 | 役割 |
|---|---|
| UPDATE文 | 既存のレコードの値を変更する |
Webアプリケーションでは、プロフィール変更、商品価格の変更、在庫数の更新、注文状態の変更などでUPDATE文を使います。
すでに登録されているデータを新しい値に更新するときに必要です。
DELETE文はレコードを削除する
DELETE文は、不要になったレコードを削除するためのSQL文です。
たとえば、退職した社員データを削除したり、不要な商品データを削除したりする場合に使います。
DELETE文の役割
| SQL文 | 役割 |
|---|---|
| DELETE文 | テーブルからレコードを削除する |
DELETE文は強力な命令です。
条件を間違えると、必要なデータまで削除してしまう危険があります。
そのため、実際の開発では、削除条件を慎重に指定します。
また、業務システムでは、物理的に削除するのではなく、削除フラグを立てて画面に表示しないようにする方法が使われることもあります。
DBMSとデータベースをまとめてデータベースと呼ぶことがある
厳密には、データベースはデータを保存する場所であり、DBMSはそのデータを管理するソフトウェアです。
ただし、実際の会話や説明では、DBMSとデータベースをまとめてデータベースと呼ぶことがあります。
狭い意味と広い意味のデータベース
| 表現 | 内容 |
|---|---|
| 狭い意味のデータベース | データを保存する領域 |
| DBMS | データベースを管理するソフトウェア |
| 広い意味のデータベース | DBMSとデータ保存領域をまとめたもの |
たとえば、MySQLを使う、PostgreSQLを使う、H2 Databaseを使う、と言う場合、DBMSとデータ保存の仕組みをまとめて指していることが多いです。
学習中は、DBMSがSQLを受け取り、データベース内のデータを操作している、と考えると理解しやすくなります。
学習で使うstudyデータベース
ここから先の学習では、studyデータベースを使う想定で説明を進めます。
studyデータベースには、従業員情報を保存するEMPLOYEESテーブルを用意します。
studyデータベースの構成
| データベース名 | テーブル名 | 内容 |
|---|---|---|
| study | EMPLOYEES | 従業員情報を保存する |
EMPLOYEESテーブルには、従業員ID、名前、年齢を保存します。
EMPLOYEESテーブルの例
| ID | NAME | AGE |
|---|---|---|
| EMP001 | 山田 太郎 | 23 |
| EMP002 | 青山 花子 | 22 |
このテーブルでは、1行が1人分の従業員データを表します。
ID列には従業員ID、NAME列には名前、AGE列には年齢を保存します。
今後、Javaプログラムからこのテーブルに接続し、SQLを使ってデータを検索する方法を学んでいきます。
EMPLOYEESテーブルの見方
EMPLOYEESテーブルは、従業員情報を表形式で管理するテーブルです。
列の意味
| 列名 | 内容 |
|---|---|
| ID | 従業員を識別するためのID |
| NAME | 従業員の名前 |
| AGE | 従業員の年齢 |
IDは、従業員を区別するための値です。
NAMEは従業員の氏名、AGEは年齢を表します。
このように、テーブルでは列ごとに保存する意味を決めておきます。
そして、1行ずつレコードを追加していきます。
H2 Databaseとは
この学習では、データベースとしてH2 Databaseを使用します。
H2 Databaseは、Javaで作成されたデータベースです。
本体はJARファイルとして提供されており、Javaの開発環境に追加しやすい特徴があります。
H2 Databaseの特徴
| 特徴 | 内容 |
|---|---|
| Javaで作成されている | Java環境と相性がよい |
| JARファイルで利用できる | クラスパスに追加して使える |
| 導入しやすい | 学習や小規模開発に向いている |
| 機能が豊富 | 基本的なSQLの学習にも使いやすい |
H2 Databaseは、学習用として扱いやすいデータベースです。
本格的な大規模業務システムでは、Oracle Database、MySQL、PostgreSQLなどが使われることもあります。
一方、H2 Databaseは手軽に導入できるため、ServletとJSPからデータベースを利用する練習に向いています。
Webアプリケーションとデータベースの関係
ServletとJSPで作るWebアプリケーションでは、ブラウザ、サーブレット、DBMS、データベースが連携します。
ブラウザからリクエストが送られると、サーブレットが処理を受け取ります。
データが必要な場合、サーブレットはJavaプログラムからSQLを使ってDBMSに命令を送ります。
DBMSはデータベースを操作し、検索結果などをJavaプログラムへ返します。
その結果をJSPで表示することで、ブラウザに画面を返します。
データベースを使う画面表示の流れ
| 順番 | 内容 |
|---|---|
| 1 | ブラウザからリクエストを送る |
| 2 | サーブレットがリクエストを受け取る |
| 3 | JavaプログラムがSQLを使ってDBMSに命令する |
| 4 | DBMSがデータベース内のテーブルを操作する |
| 5 | DBMSが結果をJavaプログラムへ返す |
| 6 | サーブレットが結果をスコープに保存する |
| 7 | JSPが結果を表示する |
| 8 | HTMLがブラウザへ返される |
これまでの学習では、データの保存先としてスコープを使っていました。
これからは、必要に応じてデータベースに保存し、SQLで取り出す流れを学んでいきます。
データベース学習で押さえたい考え方
データベースを学ぶときは、まず次の考え方を押さえておくと理解しやすくなります。
押さえたい基本
| 項目 | 内容 |
|---|---|
| データベース | データを整理して保存する仕組み |
| リレーショナルデータベース | テーブル形式でデータを管理するデータベース |
| テーブル | 行と列で構成されるデータの保存場所 |
| レコード | テーブル内の1行分のデータ |
| DBMS | データベースを管理するソフトウェア |
| SQL | DBMSに命令を出すための言語 |
| SELECT | レコードを検索する |
| INSERT | レコードを追加する |
| UPDATE | レコードを変更する |
| DELETE | レコードを削除する |
Webアプリケーションでデータベースを使うには、Java、SQL、DBMSの関係を理解する必要があります。
JavaプログラムがSQLを作り、DBMSに送ります。
DBMSがデータベースを操作し、その結果をJavaプログラムへ返します。
その結果をJSPで表示することで、サーバを再起動してもデータが残るWebアプリケーションを作れるようになります。
