サーブレット&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のような列を用意できます。

商品テーブル

IDNAMEPRICE
1ノート150
2ボールペン120
3USBメモリ1200

この表では、1行が1つの商品データを表しています。

IDが1の行は、ノートという商品を表し、価格は150です。

IDが2の行は、ボールペンという商品を表し、価格は120です。

IDが3の行は、USBメモリという商品を表し、価格は1200です。

このように、リレーショナルデータベースでは、データを表として整理して管理します。

データベースはテーブルの集まり

リレーショナルデータベースでは、1つのデータベースの中に複数のテーブルを作成できます。

たとえば、販売管理システムなら、利用者テーブル、商品テーブル、注文テーブルなどを作ります。

データベースとテーブルの関係

データベース含まれるテーブルの例
販売管理データベース利用者テーブル、商品テーブル、注文テーブル
社員管理データベース社員テーブル、部署テーブル
投稿管理データベース利用者テーブル、投稿テーブル

データベースは、複数のテーブルをまとめて管理する入れ物です。

テーブルは、同じ種類のデータを表形式で保存する場所です。

この関係を理解しておくと、データベース設計の基本が見えてきます。

図2:リレーショナルデータベースはテーブルでデータを管理する

この図から分かること

リレーショナルデータベースでは、データをテーブルとして管理します。

1つのデータベースの中には、利用者テーブル、商品テーブル、社員テーブルのように、複数のテーブルを作成できます。

テーブルは行と列で構成されます。

1行分のデータをレコードと呼び、列はID、NAME、PRICEのようなデータ項目を表します。

この表形式の管理により、大量のデータを整理して扱えるようになります。

主なデータベース製品

データベースには、商用製品とオープンソース製品があります。

業務システムでは、用途や規模、費用、運用体制に合わせてデータベース製品を選びます。

主なデータベース製品

商用オープンソース
Oracle DatabaseMySQL
Microsoft SQL ServerPostgreSQL
IBM Db2H2 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データベースの構成

データベース名テーブル名内容
studyEMPLOYEES従業員情報を保存する

EMPLOYEESテーブルには、従業員ID、名前、年齢を保存します。

EMPLOYEESテーブルの例

IDNAMEAGE
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サーブレットがリクエストを受け取る
3JavaプログラムがSQLを使ってDBMSに命令する
4DBMSがデータベース内のテーブルを操作する
5DBMSが結果をJavaプログラムへ返す
6サーブレットが結果をスコープに保存する
7JSPが結果を表示する
8HTMLがブラウザへ返される

これまでの学習では、データの保存先としてスコープを使っていました。

これからは、必要に応じてデータベースに保存し、SQLで取り出す流れを学んでいきます。

データベース学習で押さえたい考え方

データベースを学ぶときは、まず次の考え方を押さえておくと理解しやすくなります。

押さえたい基本

項目内容
データベースデータを整理して保存する仕組み
リレーショナルデータベーステーブル形式でデータを管理するデータベース
テーブル行と列で構成されるデータの保存場所
レコードテーブル内の1行分のデータ
DBMSデータベースを管理するソフトウェア
SQLDBMSに命令を出すための言語
SELECTレコードを検索する
INSERTレコードを追加する
UPDATEレコードを変更する
DELETEレコードを削除する

Webアプリケーションでデータベースを使うには、Java、SQL、DBMSの関係を理解する必要があります。

JavaプログラムがSQLを作り、DBMSに送ります。

DBMSがデータベースを操作し、その結果をJavaプログラムへ返します。

その結果をJSPで表示することで、サーバを再起動してもデータが残るWebアプリケーションを作れるようになります。