JDBCとは何ですか?Javaデータベースコネクティビティの概要

JDBC(Java Database Connectivity)は、データベースへの接続、クエリとコマンドの発行、およびデータベースから取得した結果セットの処理を管理するJavaAPIです。1997年にJDK1.1の一部としてリリースされたJDBCは、Java永続層用に開発された最初のコンポーネントの1つでした。

JDBCは当初、クライアント側APIとして考案され、Javaクライアントがデータソースと対話できるようにしました。これは、サーバー側のJDBC接続をサポートするオプションのパッケージを含むJDCB2.0で変更されました。それ以降のすべての新しいJDBCリリースでは、クライアント側パッケージ(java.sql)とサーバー側パッケージ()の両方が更新されていますjavax.sql。この記事の執筆時点で最新バージョンであるJDBC4.3は、2017年9月にJava SE9の一部としてリリースされました。

この記事では、JDBCの概要を示した後、JDBCAPIを使用してJavaクライアントを軽量のリレーショナルデータベースであるSQLiteに接続する方法を実践的に紹介します。

JDBCのしくみ

JDBCは、CベースのODBC(Open Database Connectivity)APIの代替として開発され、データベースまたはRDBMSと通信するJavaアプリケーションのメカニズムを処理するプログラミングレベルのインターフェイスを提供します。JDBCインターフェースは、次の2つのレイヤーで構成されています。

  1. JDBC APIは、JavaアプリケーションとJDBCマネージャー間の通信をサポートします。
  2. JDBCドライバーは、JDBCマネージャーとデータベースドライバー間の通信をサポートします。

JDBCは、アプリケーションコードが相互作用する一般的なAPIです。その下には、使用しているデータベースのJDBC準拠のドライバーがあります。

図1は、Java永続層におけるJDBCのアーキテクチャーの概要です。

JavaWorld /

JDBCを使用してデータベースに接続する

Javaエコシステムでのプログラミングの幸運な事実の1つは、選択したデータベースに対応する安定したJDBCデータベースコネクタが見つかる可能性が高いことです。このチュートリアルでは、SQLiteを使用してJDBCを理解します。これは、主に、JDBCが非常に使いやすいためです。

JDBCを使用してデータベースに接続する手順は次のとおりです。

  1. アクセスするデータベースをインストールまたは検索します。
  2. JDBCライブラリを含めます。
  3. 必要なJDBCドライバーがクラスパス上にあることを確認してください。
  4. JDBCライブラリを使用して、データベースへの接続を取得します。
  5. 接続を使用してSQLコマンドを発行します。
  6. 終了したら、接続を閉じます。

これらの手順を一緒に実行します。

JDBCドライバーの検索

使用するデータベースのドライバーを見つけるには、データベースとJDBCをWeb検索するだけです。たとえば、「mysql jdbc driver」と入力すると、MySQLのドライバが表示されます。JDBCドライバーのないJava互換データベースを見つけるように挑戦します!

ステップ1.SQLiteをダウンロードしてインストールします

SQLiteは非常にコンパクトなデータベースです。本番環境での使用を目的としたものではありませんが、すぐに試してみるのに最適です。SQLiteは、サービスやデーモンのインストールを必要とせずに、機能データベースとしてファイルを使用します。

このデモを開始するには、先に進んでSQLiteサンプルデータベースをダウンロードしてください。.dbファイルを解凍して、忘れられない場所に保存します。

このファイルには、機能的なファイルベースのデータベースと、使用できるサンプルスキーマおよびデータの両方が含まれています。

SQLとJDBC

NoSQLは過去10年間で人気が高まっていますが、リレーショナルデータベースは依然として最も一般的なタイプのデータストアとして使用されています。リレーショナルデータベースは、行と列を持つテーブルとからなる構成リポジトリです。SQL(Structured Query Language)は、データアーキテクトがリレーショナルデータベースの新しいレコードの作成、読み取り、更新、削除などを行うために使用する言語です。JDBCは、JavaからSQLへのアダプター層です。Java開発者に、データベースへの接続、クエリとコマンドの発行、および応答の管理のための共通のインターフェースを提供します。

ステップ2.JDBCをJavaアプリケーションにインポートします

IDEでコーディングを行うこともできますが、テキストエディターで直接コーディングすると、JDBCの単純さがわかりやすくなります。開始するには、オペレーティングシステムと互換性のあるJDKをインストールする必要があります。

Javaプラットフォーム開発者ツールがインストールされていると仮定すると、簡単なJavaプログラムを作成することから始めることができます。テキストエディタで、リスト1に示すコードを貼り付けますWhatIsJdbc.java。このファイルを呼び出します。

リスト1.単純なJavaプログラム

 class WhatIsJdbc{ public static void main(String args[]){ System.out.println("Hello JavaWorld"); } } 

次に、次のコマンドを入力してコードをコンパイルしますjavac WhatIsJdbc.java。コンパイルするとWhatIsJdbc.classファイルが出力されます。次の呼び出しを使用して、コマンドラインからこのファイルを実行しますjava WhatIsJdbc

[コマンドラインでのJDKの操作の詳細については、「JDKとは?Java DeveloperKitの概要」を参照してください。]

基本的なJavaプログラムができたら、JDBCライブラリを含めることができます。単純なJavaプログラムの先頭にリスト2のコードを貼り付けます。

リスト2.JDBCインポート

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; 

これらのインポートはそれぞれ、標準のJavaデータベース接続を容易にするクラスへのアクセスを提供します。

  • Connection データベースへの接続を表します。
  • DriverManagerデータベースへの接続を取得します。(別のオプションはDataSource、接続プールに使用されます。)
  • SQLException Javaアプリケーションとデータベース間のSQLエラーを処理します。
  • ResultSetStatementデータ結果セットとSQLステートメントをモデル化します。

これらのそれぞれの動作をまもなく確認します。

ステップ3.JDBCドライバーをクラスパスに追加します

次に、SQLiteドライバーをクラスパスに追加します。JDBCドライバは、特定のデータベースのための実装のJDBC APIというクラスです。

GitHubからSQLiteドライバーをダウンロードします。必ず最新の.jarファイルを入手して、覚えやすい場所に保存してください。

次にJavaプログラムを実行するときに.jar、クラスパスを介してそのファイルをプルします。クラスパスを設定する方法はいくつかあります。リスト3は、コマンドラインスイッチを使用してそれを行う方法を示しています。

リスト3.JavaクラスパスでSQLiteドライバーを実行する

 java.exe -classpath /path-to-driver/sqlite-jdbc-3.23.1.jar:. WhatIsJdbc 

ドライバローカルディレクトリを指すようにクラスパスを設定していることに注意してください。このようにして、Javaは引き続きクラスファイルを見つけます。

ステップ4.データベース接続を取得します

これで、クラスパスがドライバーにアクセスできるようになりました。次に、単純なJavaアプリケーションファイルをリスト4のプログラムのように変更します。

リスト4.JDBC接続クラスを使用してSQLiteに接続する

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; class WhatIsJdbc{ public static void main(String[] args) { Connection conn = null; try { String url = "jdbc:sqlite:path-to-db/chinook/chinook.db"; conn = DriverManager.getConnection(url); System.out.println("Got it!"); } catch (SQLException e) { throw new Error("Problem", e); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } } } } 

このコードをコンパイルして実行します。すべてがうまくいくと仮定すると、肯定的なメッセージが表示されます。

適切なドライバーが見つかりませんか?

No suitable driver found for jdbc:sqlite、」のようなエラーを受け取った場合は、クラスパスに再度アクセスして、ダウンロードしたドライバーを指していることを確認する必要があります。失敗したドライバー接続は、JDBCを使用する初心者にとって最も一般的な障害です。汗をかかないでください。修正するだけです。

これで、いくつかのSQLコマンドの準備が整いました。

ステップ5.データベースを照会する

ライブ接続オブジェクトが手元にあれば、データベースにクエリを実行するなど、何か便利なことができます。リスト5は、JDBCConnectionStatementオブジェクトを使用してSQLiteを照会する方法を示しています。

リスト5.JDBCを使用したデータベースのクエリ

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; class WhatIsJdbc{ public static void main(String[] args) { Connection conn = null; try { String url = "jdbc:sqlite:path-to-db-file/chinook/chinook.db"; conn = DriverManager.getConnection(url); Statement stmt = null; String query = "select * from albums"; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String name = rs.getString("title"); System.out.println(name); } } catch (SQLException e ) { throw new Error("Problem", e); } finally { if (stmt != null) { stmt.close(); } } } catch (SQLException e) { throw new Error("Problem", e); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } } } } 

リスト5では、Connectionオブジェクトを使用してオブジェクトを取得していStatementますconn.createStatement()。次に、このオブジェクトを使用してSQLクエリを実行しますstmt.executeQuery(query)

The executeQuery command returns a ResultSet object, which we then use to iterate over the data with while (rs.next()). In this example, you should see the album titles we've queried on as output.

Notice that we also closed the connection, via a call to conn.close().

Network connections with JDBC

The database connection string in Listing 5 is for a local connection: jdbc:sqlite:path-to-db-file/chinook/chinook.db. To access the database via a network, the connection string would need to include the network URL and (usually) credentials for accessing it.

Doing more with JDBC

So far we've covered the basics of using JDBC to connect to a database and issue SQL commands. While Statementss and ResultSets work well for common scenarios, you'll likely need additional options for larger or more complex applications. Fortunately, the JDBC library continues evolving to meet most database access needs.

PreparedStatements

One easy way to increase the flexibility of your code is to replace the Statement class with PreparedStatement, as shown in Listing 6.

Listing 6. Using JDBC PreparedStatements

 String prepState = "insert into albums values (?, ?);"; PreparedStatement prepState = connection.prepareStatement(sql); prepState.setString(1, "Uprising"); prepState.setString(2, "Bob Marley and the Wailers "); int rowsAffected = preparedStatement.executeUpdate(); 

PreparedStatement replaces Statement's hard-coded values with question marks (?). Using PreparedStatements optimizes your code for reuse: a PreparedStatement is compiled only once, and can then be reused with a variety of parameters. As your code base grows, you simply insert new values into the statement, instead of hacking the string object itself.

Batch updates

Whenever an application has several updates to issue, doing them in batches can greatly benefit performance. The essence of batching is to take the multiple updates and collect them together, then issue them all at once. Listing 7 uses JDBC's batch methods to perform a batch update of several PreparedStatements.

Listing 7. Batching with PreparedStatement

 prepState.setString(1, "Uprising"); prepState.setString(2, "Bob Marley and the Wailers"); preparedStatement.addBatch(); prepState.setString(1, "Wildflowers"); prepState.setString(2, "Tom Petty and the Heartbreakers"); preparedStatement.addBatch(); int[] rowsAffected = preparedStatement.executeBatch(); 

JDBC transactions

Transactions in relational databases allow for a set of updates to be wrapped in an interaction that either succeeds or fails altogether. The basics of using a transaction via JDBC are to tell the system to turn off auto-commit, and then manually tell the system to commit when you are done. By default, auto-commit is on, which means whenever an executeUpdate or executeInsert is run, the command is committed.

Listing 8 shows a small slice of a JDBC transaction.

Listing 8. JDBC transactions

 connection.setAutoCommit(false); // Use executeUpdate multiple times connection.commit(); 

When connection.commit() is encountered, all the updates wrapped inside will be attempted, and if any fail, they all will be rolled back.

There are many more features in JDBC 4.3 worth exploring, including using CallableStatement for stored procedures, using DataSource objects for improved application performance (especially via connection pooling), and converting a JDBC ResultSet to a Java Stream.

Database-specific features

Although every JDBC-compliant database offers the same core features for connecting and interacting with a database via SQL, some databases do more than others. As an example, Oracle DB offers result caching, which is not required by the JDBC specification. Here's an example:

 conn.prepareStatement ("select /*+ result_cache */ * from employees where employee_id < : 1"); 

This example is taken from the documentation for Oracle's JDBC OCI Driver.

Conclusion

JDBC is one of Java's oldest APIs, providing an easy-to-use solution for one of the perennial needs of Java application development. Knowing just the few JDBC calls demonstrated in this article will get you started using JDBC to connect to virtually any database. Once you've got those commands down, you can begin to explore some of the more sophisticated options that have been built into JDBC.

より単純なアプリケーションにはJDBCで十分ですが、ほとんどの開発者は、より正式なデータアクセス層を開発するために、最終的にJava Persistence API(JPA)に目を向けます。JPAには、より事前の作業とアプリケーションアーキテクチャのより高度な理解が必要ですが、JPAを使用すると、より一貫性があり、分離され、明確に定義されたデータアクセス層が得られます。Javaアプリケーションのデータ永続化レイヤーの開発の詳細については、この記事の関連記事「JPAとは?Java PersistenceAPIの概要」を参照してください。

このストーリー「JDBCとは?Javaデータベースコネクティビティの概要」は、もともとJavaWorldによって公開されました。