検索

キーワード


【Java】JDBCとは?

  • 公開日:2020-10-22 15:54:24
  • 最終更新日:2020-11-16 23:55:40

こんにちは。エンジニアの新田です!

ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。

今回は、Javaからデータベースに接続するときに必要となるJDBCドライバとは何なのかを説明します。

Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!

関連記事:【Java】Webアプリケーションからデータベースへの接続


JDBCとは?

JDBC(Java Database Connectivity)は、リレーショナル・データベース(その他にもスプレッドシートなどの表形式のデータにもアクセス可能)にアクセスするために用意されたJava標準APIです。

リレーショナルデータベースは多くのシステムで採用されており、JDBCはJavaの基礎となる重要なAPIの1つとなっています。


JDBCとJavaサーブレット、データベースの関係を例にすると以下のようになっています。

JDBCとJavaサーブレット、データベースの関係

Javaサーブレットとデータベースの間に「JDBCドライバ」を介してデータベース接続を実現しています。

JDBCドライバを介することでデータベース間の差異を吸収するとともに、標準APIであるJDBC APIを利用することによって、データベースの種類に依存しないアプリケーションを構築することが可能になります。(つまり、同じ実装、同じAPIの実行でどの異なるデータベースともやり取りができるようになります。

JDBCを使う事で、実行環境に依存しないというJavaの特徴(Write Once, Run Anywhere)に加えて、データベースの違いに対する依存度も最低限にする事が可能になります。


JDBCは、以下のような様々なJavaコンポーネントから利用することができます。

  • 通常のJavaクラスや、JavaBeans
  • クライアントで動作する、Javaアプリケーション
  • Webクライアント(Webブラウザ)で動作する、Java Applet
  • Webコンテナ(J2EEサーバ)で動作する、ServletやJSP
  • EJBコンテナ(J2EEサーバ)で動作する、Session BeanやEntity Bean


JDBCの構成

JDBCの基本的な構成は以下のようになっています。

JDBCの基本的な構成


JDBC API

JavaプログラムとJDBCドライバマネージャを接続インターフェイスです。(Javaプログラム内でJDBC操作に使用するAPI群)

例えば、以下のようなAPIが提供されています。(詳細についてはJDBCのドキュメントをご確認ください)

  • JavaプログラムからDBサーバへ接続する
  • SQL文を組み立て、DBサーバで実行する
  • DBサーバが処理した結果を取得する
  • DBの情報、処理結果に関する情報などを取得する


JDBCドライバマネージャ

JDBC構成の中で中核をなすモジュール。

JDBCドライバの登録、維持などの管理を行い、JavaアプリケーションとJDBCドライバの接続を供給します。

これにより、アプリケーション側でドライバ管理などの複雑な処理を記述する必要がなくなります。


JDBCドライバAPI

JDBCドライバマネージャと、各データベースのベンダから提供されるJDBCドライバとを接続するためのインターフェイスです。

JDBCドライバを開発する場合には、これらのAPIが必要となりますが、Javaアプリケーションのプログラム実装側では意識する必要はありません。


JDBCドライバ

データベースへの直接的な接続および制御を提供するモジュールです。JDBC APIの実行に基づき、必要な操作を実行します。

通常、JDBCドライバは各データベースのベンダから提供されています。


JDBCドライバの種類

JDBCドライバはその実装方法の違いから、4つのタイプに分類されます。


タイプ1:JDBC-ODBCブリッジドライバ
タイプ2:ネイティブAPIドライバ
タイプ3:通信プロトコルドライバ
タイプ4:ネイティブプロトコルドライバ


タイプ1、タイプ2は Pure Javaでないため、Java本来の利点である「Write Once, Run Anywhere(一度書いたプログラムがどこでも動く)」を実現することができません。

これらはPure Javaドライバがまだ存在しなかった間の過渡的な構成であるとされています。

当初はODBC対応のデータベースが豊富であり、タイプ1ドライバがJDKに付属されて事もあってポピュラーなドライバでしたが、現在では多くのデータベースベンダがPure Javaドライバを提供するようになり、Pure Javaドライバであるタイプ3,タイプ4がポピュラーなドライバになりました。

タイプ3、タイプ4のドライバは、自動インストールをはじめとしたJavaテクノロジのすべての利点を提供することができるという点で現時点では最も望ましいソリューションです。


タイプ1:JDBC-ODBCブリッジドライバ

JDBC APIの呼び出しをODBC (Open DataBase Connectivity) APIの呼び出しに変換するブリッジコンポーネントです。

ODBCを経由することによりODBCに対応する多くのDBMSを利用することができますが、ODBCドライバを経由してDBMSに接続することになるので、JDBC-ODBC ブリッジドライバを使用するクライアントマシンに、ODBCドライバが インストールされている必要があります。

ODBCドライバのインストールが必要なため、Appletから利用することはできません。

Java SE7 までは標準で添付されているドライバでしたが、Java7では非推奨となり、Java8では標準から削除されました。


タイプ2:ネイティブAPIドライバ

JDBC APIの呼び出しをDBMS固有のクライアントAPI呼び出しに変換します。

つまり、JDBCからのクエリー要求を、OS上のDLLや専用ライブラリに受け渡し、そこからデータベースにアクセスするという事になります。この場合、TYPE 2のJDBCドライバのほかに、データベース接続 に必要なデータベース固有の仕組み(DDLや専用ライブラリ)が必要になります。

これらのベンダ依存のライブラリを、クライアントにインストールする必要があるため、タイプ1ドライバと同様に、Appletから利用することはできません。

オラクルを例に挙げると、OCIドライバがタイプ2ドライバに該当します。(Oracleクライアントのインストールが必要)


タイプ3:通信プロトコルドライバ

JDBCドライバの形態の中で最も柔軟性を持つものです。

タイプ2では、データベース専用のクライアントライブラリを必要としていましたが、タイプ3ではこの部分を中継サーバと呼ばれる層で実装します。

JDBCドライバと中継サーバ間は、データベースに依存しない、Pure Java形式で実装できます。

JDBCドライバはJDBC APIをDBMSに依存しないネットプロトコルに変換し、中継サーバに接続します。中継サーバではネットプロトコルをデータベース固有のプロトコルに変換し通信を行います。

主要な処理を中継サーバが行うことでドライバ部分の処理を単純化する事ができる(JDBCドライバでネイティブAPIをサポートする必要がない)ため、タイプ4に比べて軽量である点がメリットですが、システム構成が複雑になり中継サーバを挟むためパフォーマンスに影響が出る可能性があります。


タイプ4:ネイティブプロトコルドライバ

タイプ2やタイプ3で必要だった、データベース固有のライブラリや中継サーバの機能を、すべてJDBCドライバ内部に実装したPure Javaのドライバです。

データベースへの接続に必要なすべての処理が含まれるため、タイプ3ドライバと比較してドライバサイズが大きくなります。

基本的にTCP/IPでしか利用できないなどの制限もありますが、環境に依存しないため移植性に優れており、4つのタイプの中で最もシンプルな構成をとる事ができます。

オラクルを例に挙げると、thinドライバがタイプ4ドライバに該当します。(このドライバからデータベースと直接通信可能)


関連記事:【Java】Webアプリケーションからデータベースへの接続



【著者】

新田

JavaメインのWebアプリケーション開発に多く携わっています。
Javaの基本的な部分の紹介や、これまで経験したシステム開発手法、新しい技術についても紹介していこうと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様