サーブレット&JSPの基本|H2のJDBCドライバを導入する

JavaとH2 Databaseをつなぐ部品を準備する。JDBCドライバを導入して、JavaプログラムからSQLを実行できる環境を整えよう

前回は、H2 Databaseをインストールし、studyデータベースを作成しました。

さらに、studyデータベースの中にEMPLOYEESテーブルを作成し、従業員データを追加しました。

ここまでの作業で、H2コンソールからSQLを実行できる状態になっています。

ただし、ServletやJavaクラスからデータベースを操作するには、もう一段階準備が必要です。

Javaプログラムからデータベースを利用するときは、SQL文をデータベースへ送り、検索結果を受け取ります。

たとえば、EMPLOYEESテーブルから従業員一覧を取得したい場合、JavaプログラムはDBMSに対してSELECT文を送信します。そして、DBMSが検索した結果をJavaプログラムが受け取ります。

このやり取りを行うために使うのが、java.sqlパッケージとJDBCドライバです。

java.sqlパッケージは、Javaに標準で用意されているAPIです。データベースへ接続する、SQLを送信する、検索結果を受け取る、といった基本的な部品が含まれています。

一方、JDBCドライバは、使用するデータベース製品ごとに用意されるライブラリです。

H2 Databaseを使う場合は、H2 Database用のJDBCドライバが必要です。

この記事では、JavaプログラムからH2 Databaseを利用するために必要なjava.sqlパッケージの役割を確認し、H2のJDBCドライバを入手して、動的Webプロジェクトstudyに配置する手順を学習します。

Javaプログラムからデータベースを使う流れ

Javaプログラムからデータベースを利用するときは、プログラムが直接テーブルの中身を触るわけではありません。

Javaプログラムは、DBMSにSQL文を送信します。

DBMSはそのSQL文を受け取り、データベースの中にあるテーブルを操作します。

検索結果がある場合は、DBMSからJavaプログラムへ結果が返されます。

Javaプログラムとデータベースの基本的な流れ

順番処理内容
1JavaプログラムがSQL文を用意するSELECT文などを作成する
2データベースへ接続するJavaプログラムとDBMSをつなぐ
3SQL文を送信するDBMSに処理を依頼する
4DBMSがテーブルを操作するEMPLOYEESテーブルなどを検索する
5検索結果を受け取るJavaプログラムで結果を扱う
6接続を終了するデータベースとの接続を閉じる

この流れをJavaプログラムで実現するために、java.sqlパッケージのクラスやインタフェースを使います。

java.sqlパッケージとは

java.sqlパッケージは、Javaプログラムからデータベースを操作するためのクラスやインタフェースをまとめたパッケージです。

Java SEの標準APIに含まれているため、追加でダウンロードする必要はありません。

Javaファイルの中でimportして使用します。

java.sqlパッケージの主なクラスやインタフェース

クラス/インタフェース機能
DriverManagerDBMSへの接続準備を行う
ConnectionDBMSへの接続や切断を行う
PreparedStatementSQL文の送信を行う
ResultSetDBMSから検索結果を受け取る
SQLExceptionデータベースに関するエラー情報を提供する

これらは、JDBCプログラムを作るときに何度も登場します。

最初は名前が少し難しく見えるかもしれませんが、それぞれの役割をイメージで押さえると理解しやすくなります。

図1:Javaプログラムからデータベースを利用する流れ

この図から分かること

Javaプログラムからデータベースを使うときは、JavaプログラムとDBMSの間に接続を作ります。

この接続を表すのがConnectionです。

SQL文を送信する役割を持つのがPreparedStatementです。

SELECT文などをDBMSへ送り、DBMSがEMPLOYEESテーブルを検索します。

検索結果はResultSetとしてJavaプログラム側で受け取ります。

このように、Connection、PreparedStatement、ResultSetは、Javaプログラムとデータベースのやり取りを支える重要な部品です。

DriverManagerの役割

DriverManagerは、データベースへ接続するための準備を行うクラスです。

Javaプログラムからデータベースへ接続するとき、どのデータベースへ接続するのか、どのユーザーで接続するのか、といった情報を使います。

DriverManagerは、その接続要求を受け取り、適切なJDBCドライバを利用してデータベースへの接続を作ります。

DriverManagerのイメージ

項目内容
役割データベース接続の入口
主な仕事接続情報をもとにConnectionを取得する
関係する情報JDBC URL、ユーザー名、パスワード
利用場面JavaプログラムからDBMSへ接続するとき

DriverManagerは、データベース接続の入口になるクラスだと考えると分かりやすいです。

Connectionの役割

Connectionは、Javaプログラムとデータベースの接続を表すインタフェースです。

JavaプログラムからデータベースへSQLを送信するには、まずConnectionを取得する必要があります。

Connectionがあることで、JavaプログラムはDBMSとやり取りできます。

Connectionのイメージ

項目内容
役割JavaプログラムとDBMSをつなぐ接続
イメージプログラムとデータベースを結ぶ道路
主な用途SQL文を送る準備、接続の終了
注意点使い終わったら閉じる必要がある

Connectionは、Javaプログラムとデータベースをつなぐ道路のような存在です。

道路がなければ車が走れないように、ConnectionがなければSQL文を送ることはできません。

PreparedStatementの役割

PreparedStatementは、SQL文をデータベースへ送信するためのインタフェースです。

JavaプログラムでSQL文を用意し、そのSQL文をPreparedStatementを通じてDBMSへ送ります。

たとえば、従業員一覧を取得する場合は、次のようなSELECT文を送ります。

SELECT ID, NAME, AGE FROM EMPLOYEES

PreparedStatementのイメージ

項目内容
役割SQL文をDBMSへ送信する
イメージSQL文を運ぶ車
主な用途SELECT文、INSERT文、UPDATE文、DELETE文の実行
利点SQL文を安全かつ扱いやすい形で実行できる

PreparedStatementは、SQL文を運ぶ車のようなものです。

Connectionという道路を通って、SQL文をDBMSへ届けます。

ResultSetの役割

ResultSetは、SELECT文の検索結果を受け取るためのインタフェースです。

DBMSが検索した結果は、Javaプログラム側でResultSetとして扱います。

たとえば、EMPLOYEESテーブルから従業員一覧を検索した場合、ID、NAME、AGEの値がResultSetに入って返ってきます。

ResultSetのイメージ

項目内容
役割DBMSから返された検索結果を受け取る
イメージ検索結果を受け取る宅配ボックス
主な用途SELECT文の結果を1行ずつ取り出す
注意点INSERT文やUPDATE文の結果とは扱いが異なる

ResultSetは、検索結果を受け取るための箱のような存在です。

JavaプログラムはResultSetから1行ずつデータを取り出し、必要に応じてJavaBeansに詰め替えたり、JSPへ渡したりします。

SQLExceptionの役割

SQLExceptionは、データベースに関するエラー情報を表す例外クラスです。

データベース接続に失敗した場合、SQL文に誤りがある場合、テーブルが存在しない場合など、データベース処理ではさまざまなエラーが起こる可能性があります。

そのようなエラーを扱うためにSQLExceptionを使います。

SQLExceptionが関係する場面

状況
接続エラーJDBC URLが間違っている
認証エラーユーザー名やパスワードが違う
SQLエラーSELECT文やINSERT文に誤字がある
テーブルエラー指定したテーブルが存在しない
制約違反主キーが重複している、NOT NULL列に値がない

JDBCプログラムでは、SQLExceptionが発生する可能性を考えながら、例外処理を書く必要があります。

JDBCドライバとは

Javaプログラムからデータベースを使うには、java.sqlパッケージだけでは足りません。

使用するデータベースに対応したJDBCドライバが必要です。

JDBCドライバは、Javaプログラムとデータベース製品の間をつなぐためのライブラリです。

H2 Databaseを使うなら、H2 Database用のJDBCドライバを用意します。

MySQLを使うなら、MySQL用のJDBCドライバが必要です。

PostgreSQLを使うなら、PostgreSQL用のJDBCドライバが必要です。

java.sqlパッケージとJDBCドライバの違い

項目java.sqlパッケージJDBCドライバ
提供元Java SEの標準API各データベース製品の開発元
準備追加準備は不要JARファイルを入手して配置する
役割データベース操作の共通インタフェースを提供する各DBMSに合わせた実際の接続処理を担当する
開発者の使い方importして利用するWEB-INF/libなどに配置して利用可能にする

開発者は、基本的にjava.sqlパッケージのクラスやインタフェースを使ってプログラムを書きます。

JDBCドライバの中身を直接詳しく扱う必要はありません。

ただし、JDBCドライバがプロジェクトに配置されていないと、JavaプログラムはH2 Databaseへ接続できません。

図2:java.sqlパッケージとJDBCドライバの関係

この図から分かること

Javaプログラムでは、DriverManager、Connection、PreparedStatement、ResultSetなど、java.sqlパッケージの部品を使ってデータベース処理を書きます。

ただし、実際にH2 Databaseへ接続するには、H2 Database用のJDBCドライバが必要です。

JDBCドライバは、H2 Databaseに合わせた接続処理を担当します。

開発者はJDBCドライバの中身を直接細かく操作するのではなく、java.sqlパッケージを通じて間接的に利用します。

JDBCプログラムとは

java.sqlパッケージとJDBCドライバを使って、データベースを利用するJavaプログラムをJDBCプログラムと呼びます。

JDBCプログラムでは、JavaプログラムからSQL文を送信し、データベースの検索結果を受け取ったり、データを追加したり、変更したり、削除したりします。

JDBCプログラムでできること

処理使うSQL文Java側で使う主な部品
従業員一覧を取得するSELECT文Connection、PreparedStatement、ResultSet
従業員データを追加するINSERT文Connection、PreparedStatement
従業員データを変更するUPDATE文Connection、PreparedStatement
従業員データを削除するDELETE文Connection、PreparedStatement

検索処理では、DBMSから結果が返ってくるため、ResultSetを使います。

一方、追加、変更、削除では、検索結果の一覧を受け取るわけではないため、ResultSetを使わない形になることが多いです。

H2のJDBCドライバを入手する

H2 DatabaseへJavaプログラムから接続するには、H2 Database用のJDBCドライバを入手します。

H2 Databaseのダウンロードページにアクセスし、MavenのBinary JARをクリックします。

https://www.h2database.com/html/download.html

すると、H2 DatabaseのJDBCドライバであるh2-x.x.x.jarをダウンロードできます。

x.x.xの部分はバージョン番号です。

JDBCドライバ入手の流れ

手順内容
1H2 Databaseのダウンロードページへアクセスする
2MavenのBinary JARを探す
3Binary JARをクリックする
4h2-x.x.x.jarをダウンロードする
5ダウンロードしたJARファイルを確認する

JARファイルは、Javaのライブラリをまとめたファイルです。

H2のJDBCドライバもJARファイルとして提供されます。

ダウンロードしたh2-x.x.x.jarを、動的Webプロジェクトstudyで使える場所に配置します。

JDBCドライバをWEB-INF/libに配置する

動的WebプロジェクトでJDBCドライバを使う場合、JARファイルをWEB-INF/libフォルダに配置します。

studyプロジェクトでは、配置先は次の場所です。

src/main/webapp/WEB-INF/lib

Eclipseでは、ダウンロードしたh2-x.x.x.jarを、src/main/webapp/WEB-INF/libへドラッグアンドドロップします。

ダイアログが表示されたら、ファイルをコピーを選択してOKをクリックします。

src/main/webapp//WEB-INF/lib に JDBCドライバがコピーされていることを確認します。

JDBCドライバの配置手順

手順内容
1ダウンロードしたh2-x.x.x.jarを用意する
2Eclipseでstudyプロジェクトを開く
3src/main/webapp/WEB-INF/libフォルダを確認する
4h2-x.x.x.jarをWEB-INF/libへドラッグアンドドロップする
5ダイアログでファイルをコピーを選択する
6OKをクリックする
7WEB-INF/libにJARファイルがコピーされたことを確認する

WEB-INF直下ではなく、WEB-INF/libに配置する点に注意しましょう。

libフォルダは、Webアプリケーションで使用するライブラリのJARファイルを置く場所です。

図3:H2のJDBCドライバをstudyプロジェクトに配置する

この図から分かること

H2 Database用のJDBCドライバは、H2 DatabaseのダウンロードページからBinary JARとして入手します。

ダウンロードしたh2-x.x.x.jarは、Eclipseの動的Webプロジェクトstudy内にあるsrc/main/webapp/WEB-INF/libフォルダへ配置します。

WEB-INF/libにJARファイルを置くことで、Webアプリケーション内のJavaプログラムからH2のJDBCドライバを利用できるようになります。

配置場所をWEB-INF直下にしてしまうと、ライブラリとして正しく扱われないことがあるため、必ずWEB-INF/libに配置するようにしましょう。

JDBCプログラム開発に必要なもの

JavaからH2 Databaseを利用するJDBCプログラムを作るには、次の2つが必要です。

JDBCプログラムに必要なもの

必要なもの内容準備
java.sqlパッケージデータベース操作のための標準APIJava SEに含まれているため追加準備は不要
JDBCドライバH2 Databaseへ接続するためのライブラリH2 Databaseの開発元から入手してWEB-INF/libに配置する

java.sqlパッケージは、Javaに標準で含まれているため、追加でダウンロードする必要はありません。

一方、JDBCドライバは、使用するデータベース製品に合わせて用意します。

今回使用するのはH2 Databaseなので、H2 Database用のJDBCドライバであるh2-x.x.x.jarを配置します。

WEB-INF/libに配置する理由

動的Webプロジェクトでは、Webアプリケーションで使うライブラリをWEB-INF/libに配置します。

このフォルダに置いたJARファイルは、Webアプリケーションの実行時に利用できるようになります。

WEB-INF/libの役割

項目内容
配置するものWebアプリケーションで使うJARファイル
H2のJDBCドライバ、JSTLのJARファイルなど
配置先src/main/webapp/WEB-INF/lib
注意点WEB-INF直下ではなくlibフォルダに置く

H2のJDBCドライバをWEB-INF/libに置くことで、ServletやDAOクラスなどのJavaプログラムからH2 Databaseへ接続できるようになります。

今後、ConnectionやPreparedStatementを使ってEMPLOYEESテーブルを検索するプログラムを作るとき、このJDBCドライバが必要になります。

導入後に確認しておきたいこと

JDBCドライバを配置したら、Eclipse上で配置場所を確認しましょう。

確認ポイント

確認項目内容
JARファイル名h2-x.x.x.jarがあるか
配置先src/main/webapp/WEB-INF/libにあるか
配置方法ファイルをコピーで取り込んだか
プロジェクト名studyプロジェクトに配置しているか
H2 Database今後接続するstudyデータベースが作成済みか

JDBCドライバが正しく配置されていないと、JavaプログラムからH2 Databaseへ接続できません。

たとえば、接続処理を書いたときに、ドライバが見つからないという内容のエラーが出ることがあります。

エラーを防ぐためにも、最初にWEB-INF/libへ正しく配置されているか確認しておくと安心です。

ここまでで準備できたこと

ここまでの作業で、JavaプログラムからH2 Databaseへ接続するための準備が整いました。

準備できた内容

項目内容
java.sqlパッケージJava SE標準APIとして利用できる
H2のJDBCドライバh2-x.x.x.jarとして入手する
配置先studyプロジェクトのsrc/main/webapp/WEB-INF/lib
今後使う主な部品DriverManager、Connection、PreparedStatement、ResultSet、SQLException
接続対象H2 Databaseのstudyデータベース

次にJDBCプログラムを書くときは、java.sqlパッケージのクラスやインタフェースをimportして利用します。

そして、WEB-INF/libに配置したH2のJDBCドライバを通じて、H2 Databaseへ接続します。

これにより、JavaプログラムからSQL文を送信し、EMPLOYEESテーブルのデータを取得する準備が整います。