Java Database Connectivity ( JDBC ) は、Javaプログラミング言語用のアプリケーション プログラミング インターフェイス(API)であり、クライアントがデータベースにアクセスする方法を定義します。これは、Java データベース接続に使用される Java ベースのデータ アクセス技術です。Oracle CorporationのJava Standard Editionプラットフォームの一部です。データベース内のデータを照会および更新するメソッドを提供し、リレーショナル データベース向けに設計されています。JDBC とODBCのブリッジにより、Java 仮想マシン(JVM) ホスト環境内の ODBC でアクセス可能なあらゆるデータ ソースに接続できます。
サン・マイクロシステムズは、 1997年2月19日にJava Development Kit (JDK) 1.1の一部としてJDBCをリリースしました。[ 1 ] それ以来、Java Platform, Standard Edition (Java SE)の一部となっています。
JDBC クラスはJava パッケージjava.sqlおよびに含まれておりjavax.sql、その他にもいくつかのクラスが他の場所にあります。JDBC に関連するすべてのものはモジュールjava.sqlを通じてエクスポートされます。
バージョン 3.1 以降、JDBC はJava Community Processの下で開発されています。JSR 54 は JDBC 3.0 (J2SE 1.4 に含まれています) を規定し、JSR 114 は JDBC Rowset の追加 ( 用javax.sql.RowSet) を規定し、JSR 221 は JDBC 4.0 (Java SE 6 に含まれています) の仕様です。[ 2 ]
JDBC 4.1 は、JSR 221 [ 3 ]のメンテナンス リリース 1 で規定されており、Java SE 7 [ 4 ]に含まれています。
JDBC 4.2 は、JSR 221 [ 5 ]のメンテナンス リリース 2 で規定されており、Java SE 8 [ 6 ]に含まれています。
最新バージョンである JDBC 4.3 は、JSR 221 [ 7 ]のメンテナンス リリース 3 で規定されており、Java SE 9 [ 8 ]に含まれています。
JDBCは主にインターフェース定義と仕様の集合体であるため、これらのインターフェースの複数の実装が存在し、実行時に同じアプリケーションで使用できます。APIは、適切なJavaパッケージを動的にロードし、JDBCドライバマネージャ(java.sql.DriverManager)に登録するメカニズムを提供します。は、JDBC接続を作成するためのファクトリjava.sql.DriverManagerとして使用されます。java.sql.Connection
JDBC接続は、ステートメントの作成と実行をサポートします。JDBC接続は、SQLのCREATE、INSERT、UPDATE、DELETEなどの更新ステートメント、またはSELECTなどのクエリステートメントをサポートします。さらに、JDBC接続を介してストアドプロシージャを呼び出すこともできます。JDBCは、以下のいずれかのクラスを使用してステートメントを表します。
Statement–は毎回データベースサーバーjava.sql.Statementに送信されます。言い換えれば、メソッドは SQL ステートメントを使用して実行され、データを含むオブジェクトを取得します。[ 9 ]java.sql.Statementjava.sql.ResultSetPreparedStatement–java.sql.PreparedStatementはインターフェースのサブインターフェースですjava.sql.Statement。[ 9 ]ステートメントはキャッシュされ、データベースサーバー上で実行パスが事前に決定されるため、効率的に複数回実行できます。 [ 9 ]java.sql.PreparedStatementは、プリコンパイルされた SQL ステートメントを実行するために使用されます。[ 9 ]プリコンパイルされたステートメントを実行すると、ステートメントの実行効率とパフォーマンスが向上します。 は、java.sql.PreparedStatement入力パラメータの一部をターゲットデータベースに渡す必要がある動的ステートメントによく使用されます。[ 10 ]により、java.sql.PreparedStatementクエリパラメータに応じて動的クエリを変更できます。[ 11 ]CallableStatement–java.sql.CallableStatementはインターフェースのサブインターフェースですjava.sql.Statement。[ 11 ]これはデータベース上でストアドプロシージャを実行するために使用されます。 [ 11 ] [ 12 ]ストアドプロシージャには、入力パラメータと出力パラメータの両方をデータベースに渡す必要があります。[ 13 ]INSERT、などの更新ステートメントはUPDATE、データベースで影響を受けた行数DELETEを整数として示す更新カウントを返します。 [ 13 ]これらのステートメントは、その他の情報は返しません。
クエリ文はJDBCの行結果セットを返します。行結果セットは、結果セットを走査するために使用されます。行内の個々の列は、名前または列番号によって取得されます。結果セットには任意の数の行が含まれる可能性があります。行結果セットには、列の名前とその型を記述するメタデータが含まれています。
には、基本的な JDBC API の拡張機能がありますjavax.sql。
JDBC接続は、ドライバから直接取得するのではなく、接続プールjavax.sql.DataSourceを介して管理されることが多い。[ 14 ]
Javaアプリケーションがデータベース接続を必要とする場合、いずれかのDriverManager.getConnection()方法を用いてJDBCを作成しますjava.sql.Connection。使用されるURLは、使用するデータベースとJDBCドライバによって異なります。URLは常にjdbc:プロトコルで始まりますが、それ以外の部分はベンダーによって異なります。
import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ;Connection conn = DriverManager.getConnection ( " jdbc :somejdbcvendor:other data needed by some jdbc vendor" , "myLogin" , "myPassword" ) ;try { // ここで接続を使用する} finally { try { // 処理が完了したら接続を閉じるconn.close (); } catch ( SQLException e ) { // ここでキャッチした例外ではなく、元の例外を伝播するlogger.warn ( " JDBC接続を閉じられませんでした" , e ) ; } }Java SE 7以降では、Javaのtry-with-resources文を使用して上記のコードを簡略化できます。
import java.sql.Connection ; import java.sql.DriverManager ;try ( Connection conn = DriverManager . getConnection ( "jdbc:somejdbcvendor:other data needed by some jdbc vendor" , "myLogin" , "myPassword" )) { // ここで接続を使用する} // conn.close() が自動的に呼び出されます// try ブロックを抜けると接続は自動的に閉じられます接続が確立されると、をjava.sql.Statement作成できます。
import java.sql.Statement ;try ( Statement stmt = conn . createStatement ()) { stmt . executeUpdate ( "INSERT INTO MyTable(name) VALUES ('my name')" ); }java.sql.Connections、java.sql.Statements、およびsは、ソケットやファイルディスクリプタなどのオペレーティングシステムのjava.sql.ResultSetリソースを占有することが多いことに注意してください。リモートデータベースサーバーへのsの場合、サーバー側でも、現在開いているsのカーソルなど、さらに多くのリソースが占有されます。JDBCオブジェクトは、その役割を果たしたらすぐに 解放されることが不可欠です。ガベージコレクションに頼るべきではありません。上記のtry-with-resources構文は、これを回避するコードパターンです。java.sql.Connectionjava.sql.ResultSetclose()
データは、データベースクエリ機構を使用してデータベースから取得されます。以下の例は、ステートメントを作成してクエリを実行する方法を示しています。
import java.sql.ResultSet ; import java.sql.Statement ;try ( Statement stmt = conn . createStatement (); ResultSet rs = stmt . executeQuery ( "SELECT * FROM MyTable" ) ) { while ( rs . next ()) { int numColumns = rs . getMetaData (). getColumnCount (); for ( int i = 1 ; i <= numColumns ; i ++ ) { // 列番号は 1 から始まります。 // また、結果セットには、列を特定の型として返すためのメソッドが多数あります。// 有効な変換の一覧については、Sun のドキュメントを参照してください。System . out . printf ( "COLUMN %d = %s%n" , i , rs . getObject ( i )); } } }以下のコードは、最初の例のクラスをjava.sql.PreparedStatement使用するクエリの例です。conn
import java.sql.PreparedStatement ; import java.sql.ResultSet ;try ( PreparedStatement ps = conn . prepareStatement ( "SELECT i.*, j.* FROM Omega i, Zappa j WHERE i.name = ? AND j.num = ?" ) ) { // 準備中の SQL ステートメントでは、各疑問符はプレースホルダーであり、 // "set" メソッド呼び出しによって指定した値に置き換える必要があります。// 次の 2 つのメソッド呼び出しは、2 つのプレースホルダーを置き換えます。最初のプレースホルダーは文字列値に、2 番目のプレースホルダーは整数値に置き換えられます。ps . setString ( 1 , "Poor Yorick" ); ps . setInt ( 2 , 8008 );// ResultSet rs は、SQL ステートメントの実行結果を表します。// rs.next() を呼び出すたびに、内部行ポインタ、つまりカーソルが// 結果の次の行に進みます。カーソルは最初は最初の行の前に配置されます。try ( ResultSet rs = ps . executeQuery ()) { while ( rs . next ()) { for ( int i = 1 ; i <= rs . getMetaData (). getColumnCount (); i ++ ) { // 列番号は 1 から始まります。// また、結果セットには、列を特定の型として返すためのメソッドが多数あります。 // 有効な変換の一覧については、Sun のドキュメントを参照してください。 System . out . printf ( "COLUMN %d = %s%n" , i , rs . getObject ( i )); } } } }データベース操作が失敗すると、JDBC は例外を発生させますSQLException。このようなエラーから回復するためにできることは、可能な限り詳細なログを記録すること以外にはほとんどありません。例外をjava.sql.SQLExceptionアプリケーション ドメイン例外 (非チェック例外) に変換し、最終的にトランザクションのロールバックとユーザーへの通知を行うことをお勧めします。
import java.sql.SQLException ;boolean autoCommitDefault = conn.getAutoCommit ( ) ; try { conn.setAutoCommit ( false ) ;// ここでconnに対してトランザクション的にステートメントを実行しますconn.commit ( ) ; } catch ( SQLException e ) { try { conn.rollback ( ); } catch ( Throwable e ) { logger.warn ( "トランザクションをロールバックできませんでした" , e ) ; } throw e ; } finally { try { conn.setAutoCommit ( autoCommitDefault ) ; } catch ( Throwable e ) { logger.warn ( " AutoCommit設定を復元できませんでした" , e ) ; } }java.sql.CallableStatementデータベース内のストアドプロシージャを呼び出す例については、 JDBC APIガイドのドキュメントを参照してください。
パッケージorg.wikipedia.examples ;import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.Statement ;public class DatabaseExample { private static final String DB_URL = "jdbc:mysql://localhost/mydb" ;public static void main ( String [] args ) { try { Class . forName ( "com.mysql.jdbc.Driver" );Connection conn = DriverManager.getConnection ( DB_URL , " root" , "root" ); Statement stmt = conn.createStatement ( ) ; String sql = " INSERT INTO emp1 VALUES ('pctb5361', 'kiril', 'john', 968666668)" ; stmt.executeUpdate(sql); System.out.println ( "テーブルにレコードを挿入しました..." ) ; } catch ( SQLException e ) { System.err.printf ( " SQLエラーが発生しました: %s%n" , e.getMessage ( ) ) ; } catch ( Exception e ) { System.err.println ( "不明なエラーが発生しました。" ) ; e.printStackTrace ( ) ; } } }JDBCドライバは、JavaプログラムからのリクエストをDBMSが理解できるプロトコルに変換するクライアント側アダプタ(サーバーではなくクライアントマシンにインストールされる)です。
商用および無料のドライバは、ほとんどのリレーショナルデータベースサーバーへの接続を提供します。これらのドライバは、以下のいずれかのタイプに分類されます。
また、内部 JDBC ドライバと呼ばれるタイプにも注意してください。これは、Java 対応 SQL データベースのJREに組み込まれたドライバです。Javaストアド プロシージャに使用されます。これは上記の分類スキームには当てはまりませんが、タイプ 2 またはタイプ 4 ドライバに似ている可能性があります (データベース自体が Java で実装されているかどうかによります)。この例として、Oracle RDBMS に付属するKPRB (Kernel Program Bundled) ドライバ[ 16 ]があります。「jdbc:default:connection」は、このような接続を行うための比較的標準的な方法を提供します (少なくとも Oracle データベースとApache Derby はこれをサポートしています)。ただし、内部 JDBC ドライバの場合、JDBC クライアントは実際にアクセスされるデータベースの一部として実行されるため、ネットワーク プロトコルを介さずにデータに直接アクセスできます。
1997年2月19日 - JDK 1.1 [...]が利用可能になりました [...]。このJDKリリースには以下が含まれます: [...] データベース接続のためのJDBCを含む堅牢な新機能
内JDBCドライバ(JDBC KPRB) [:] Javaコードは、同じサーバー上のSQLにアクセスするためにJDBC KPRB(カーネルプログラムバンドル)バージョンを使用します。
java.sqlAPI Javadocドキュメントjavax.sqlAPI Javadocドキュメント