JDBC-クイックガイド
JDBCとは何ですか?
JDBCは Jエイバ Dアタbase Connectivityは、Javaプログラミング言語とさまざまなデータベース間のデータベースに依存しない接続のための標準JavaAPIです。
JDBCライブラリには、データベースの使用に一般的に関連する各タスクのAPIが含まれています。
データベースへの接続を確立する
SQLまたはMySQLステートメントの作成
データベースでそのSQLまたはMySQLクエリを実行する
結果のレコードの表示と変更
前提条件:
JDBCを学習するには、次の2つの主題について十分に理解する必要があります。
コアJAVAプログラミング
SQLまたはMySQLデータベース
JDBC-環境設定:
次の設定が完了していることを確認してください。
コアJAVAインストール
SQLまたはMySQLデータベースのインストール
上記とは別に、プロジェクトに使用するデータベースをセットアップする必要があります。これがEMPであり、同じデータベース内のテーブルEmployeesに作成したと仮定します。
JDBCアプリケーションの作成:
このチュートリアルで簡単に説明するJDBCアプリケーションの構築には6つのステップが含まれます。
パッケージをインポートします。
これには、データベースプログラミングに必要なJDBCクラスを含むパッケージを含める必要があります。ほとんどの場合、importjava.sql。*を使用すると次のようになります。
//STEP 1. Import required packages
import java.sql.*;
JDBCドライバーを登録します。
これには、データベースとの通信チャネルを開くことができるように、ドライバーを初期化する必要があります。これを実現するためのコードスニペットは次のとおりです。
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
接続を開きます:
これには、DriverManager.getConnection()メソッドを使用してConnectionオブジェクトを作成する必要があります。これは、データベースとの物理接続を次のように表します。
//STEP 3: Open a connection
// Database credentials
static final String USER = "username";
static final String PASS = "password";
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
クエリを実行します。
これには、次のようにSQLステートメントを作成してデータベースに送信するためにStatementまたはPreparedStatementタイプのオブジェクトを使用する必要があります。
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
SQL UPDATE、INSERT、またはDELETEステートメントが必要な場合は、次のコードスニペットが必要になります。
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM Employees";
ResultSet rs = stmt.executeUpdate(sql);
結果セットからデータを抽出します。
この手順は、データベースからデータをフェッチする場合に必要です。次のように、適切なResultSet.getXXX()メソッドを使用して、結果セットからデータを取得できます。
//STEP 5: Extract data from result set
while(rs.next()){
//Retrieve by column name
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
//Display values
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
環境をクリーンアップします。
次のように、JVMのガベージコレクションに依存するのではなく、すべてのデータベースリソースを明示的に閉じる必要があります。
//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();
最初のJDBCプログラム:
上記の手順に基づいて、JDBCコードの記述中にテンプレートとして使用できる次の統合サンプルコードを作成できます。
このサンプルコードは、環境の章で行われた環境とデータベースのセットアップに基づいて作成されています。
//STEP 1. Import required packages
import java.sql.*;
public class FirstExample {
// JDBC driver name and database URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost/EMP";
// Database credentials
static final String USER = "username";
static final String PASS = "password";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
//STEP 3: Open a connection
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
//STEP 5: Extract data from result set
while(rs.next()){
//Retrieve by column name
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
//Display values
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
//Handle errors for JDBC
se.printStackTrace();
}catch(Exception e){
//Handle errors for Class.forName
e.printStackTrace();
}finally{
//finally block used to close resources
try{
if(stmt!=null)
stmt.close();
}catch(SQLException se2){
}// nothing we can do
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}//end finally try
}//end try
System.out.println("Goodbye!");
}//end main
}//end FirstExample
ここで、上記の例を次のようにコンパイルしましょう。
C:\>javac FirstExample.java
C:\>
あなたが走るとき FirstExample、次の結果が生成されます。
C:\>java FirstExample
Connecting to database...
Creating statement...
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
C:\>
SQLExceptionメソッド:
SQLExceptionは、ドライバーとデータベースの両方で発生する可能性があります。このような例外が発生すると、SQLExceptionタイプのオブジェクトがcatch句に渡されます。
渡されたSQLExceptionオブジェクトには、例外に関する追加情報を取得するために使用できる次のメソッドがあります。
方法 | 説明 |
---|---|
getErrorCode() | 例外に関連付けられたエラー番号を取得します。 |
getMessage() | ドライバによって処理されたエラーのJDBCドライバのエラーメッセージを取得するか、データベースエラーのOracleエラー番号とメッセージを取得します。 |
getSQLState() | XOPENSQLstate文字列を取得します。JDBCドライバーエラーの場合、このメソッドから有用な情報は返されません。データベースエラーの場合、5桁のXOPENSQLstateコードが返されます。このメソッドはnullを返すことができます。 |
getNextException() | 例外チェーン内の次のExceptionオブジェクトを取得します。 |
printStackTrace() | 現在の例外、つまりスロー可能、およびそのバックトレースを標準エラーストリームに出力します。 |
printStackTrace(PrintStream s) | このスロー可能オブジェクトとそのバックトレースを、指定した印刷ストリームに出力します。 |
printStackTrace(PrintWriter w) | このスロー可能オブジェクトとそのバックトレースを、指定したプリントライターに出力します。 |
Exceptionオブジェクトから入手できる情報を利用することで、例外をキャッチしてプログラムを適切に続行できます。tryブロックの一般的な形式は次のとおりです。
try {
// Your risky code goes between these curly braces!!!
}
catch(Exception ex) {
// Your exception handling code goes between these
// curly braces, similar to the exception clause
// in a PL/SQL block.
}
finally {
// Your must-always-be-executed code goes between these
// curly braces. Like closing database connection.
}
JDBC-データ型:
次の表は、PreparedStatementまたはCallableStatementオブジェクトのsetXXX()メソッドまたはResultSet.updateXXX()メソッドを呼び出すときにJavaデータ型が変換されるデフォルトのJDBCデータ型をまとめたものです。
SQL | JDBC / Java | setXXX | updateXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | updateString |
CHAR | java.lang.String | setString | updateString |
LONGVARCHAR | java.lang.String | setString | updateString |
ビット | ブール値 | setBoolean | updateBoolean |
数値 | java.math.BigDecimal | setBigDecimal | updateBigDecimal |
TINYINT | バイト | setByte | updateByte |
SMALLINT | ショート | setShort | updateShort |
整数 | int | setInt | updateInt |
BIGINT | 長いです | setLong | updateLong |
リアル | 浮く | setFloat | updateFloat |
浮く | 浮く | setFloat | updateFloat |
ダブル | ダブル | setDouble | updateDouble |
VARBINARY | バイト[] | setBytes | updateBytes |
バイナリ | バイト[] | setBytes | updateBytes |
日付 | java.sql.Date | setDate | 更新日 |
時間 | java.sql.Time | setTime | updateTime |
タイムスタンプ | java.sql.Timestamp | setTimestamp | updateTimestamp |
CLOB | java.sql.Clob | setClob | updateClob |
BLOB | java.sql.Blob | setBlob | updateBlob |
アレイ | java.sql.Array | setARRAY | updateARRAY |
REF | java.sql.Ref | SetRef | updateRef |
構造体 | java.sql.Struct | SetStruct | updateStruct |
JDBC 3.0では、BLOB、CLOB、ARRAY、およびREFデータ型のサポートが強化されています。ResultSetオブジェクトにupdateBLOB()、updateCLOB()、updateArray()、およびupdateRef()メソッドが追加され、サーバー上のそれぞれのデータを直接操作できるようになりました。
setXXX()メソッドとupdateXXX()メソッドを使用すると、特定のJavaタイプを特定のJDBCデータタイプに変換できます。メソッドsetObject()およびupdateObject()を使用すると、ほとんどすべてのJavaタイプをJDBCデータ型にマップできます。
ResultSetオブジェクトは、列値を取得するために、各データ型に対応するgetXXX()メソッドを提供します。各メソッドは、列名またはその序数位置で使用できます。
SQL | JDBC / Java | setXXX | getXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | getString |
CHAR | java.lang.String | setString | getString |
LONGVARCHAR | java.lang.String | setString | getString |
ビット | ブール値 | setBoolean | getBoolean |
数値 | java.math.BigDecimal | setBigDecimal | getBigDecimal |
TINYINT | バイト | setByte | getByte |
SMALLINT | ショート | setShort | getShort |
整数 | int | setInt | getInt |
BIGINT | 長いです | setLong | getLong |
リアル | 浮く | setFloat | getFloat |
浮く | 浮く | setFloat | getFloat |
ダブル | ダブル | setDouble | getDouble |
VARBINARY | バイト[] | setBytes | getBytes |
バイナリ | バイト[] | setBytes | getBytes |
日付 | java.sql.Date | setDate | getDate |
時間 | java.sql.Time | setTime | 時間をもらう |
タイムスタンプ | java.sql.Timestamp | setTimestamp | getTimestamp |
CLOB | java.sql.Clob | setClob | getClob |
BLOB | java.sql.Blob | setBlob | getBlob |
アレイ | java.sql.Array | setARRAY | getARRAY |
REF | java.sql.Ref | SetRef | getRef |
構造体 | java.sql.Struct | SetStruct | getStruct |
JDBC-バッチ処理:
バッチ処理を使用すると、関連するSQLステートメントをバッチにグループ化し、データベースへの1回の呼び出しでそれらを送信できます。
複数のSQLステートメントを一度にデータベースに送信すると、通信オーバーヘッドの量が減り、パフォーマンスが向上します。
この機能をサポートするためにJDBCドライバーは必要ありません。あなたは使用する必要があります()DatabaseMetaData.supportsBatchUpdatesをターゲット・データベースがバッチ更新処理をサポートしているかどうかを判断する方法。JDBCドライバーがこの機能をサポートしている場合、メソッドはtrueを返します。
ザ・ addBatch()Statement、PreparedStatement、およびCallableStatementのメソッドは、個々のステートメントをバッチに追加するために使用されます。ザ・executeBatch() グループ化されたすべてのステートメントの実行を開始するために使用されます。
ザ・ executeBatch() 整数の配列を返します。配列の各要素は、それぞれの更新ステートメントの更新カウントを表します。
処理のためにステートメントをバッチに追加できるのと同じように、 clearBatch()方法。このメソッドは、addBatch()メソッドで追加したすべてのステートメントを削除します。ただし、削除するステートメントを選択的に選択することはできません。
JDBC-ストリーミングデータ:
PreparedStatementオブジェクトには、入力ストリームと出力ストリームを使用してパラメーターデータを提供する機能があります。これにより、ファイル全体を、CLOBやBLOBデータ型などの大きな値を保持できるデータベース列に配置できます。
データのストリーミングに使用できる方法は次のとおりです。
setAsciiStream(): このメソッドは、大きなASCII値を提供するために使用されます。
setCharacterStream(): このメソッドは、大きなUNICODE値を提供するために使用されます。
setBinaryStream(): このメソッドは、大きなバイナリ値を提供するために使用されます。
setXXXStream()メソッドには、パラメータープレースホルダーに加えて、追加のパラメーターであるファイルサイズが必要です。このパラメーターは、ストリームを使用してデータベースに送信する必要があるデータの量をドライバーに通知します。
これらすべての概念の詳細については、完全なチュートリアルを実行する必要があります。