Jdbc-quick-guide
JDBC-クイックガイド
JDBCとは
JDBCは* J ava D ata b ase C * onnectivityの略で、Javaプログラミング言語と広範囲のデータベース間のデータベースに依存しない接続のための標準Java APIです。 。
JDBCライブラリには、データベースの使用に一般的に関連付けられている各タスクのAPIが含まれています。
- データベースに接続する
- SQLまたはMySQLステートメントの作成
- データベースでそのSQLまたはMySQLクエリを実行する
- 結果のレコードの表示と変更
前提条件:
JDBCを学習するには、次の2つの主題について十分に理解する必要があります。
- リンク:/java/index [コアJAVAプログラミング]
- リンク:/mysql/index [SQLまたはMySQLデータベース]
JDBC-環境設定:
次のセットアップが完了していることを確認してください。
- コアJAVAインストール
- SQLまたはMySQLデータベースのインストール
上記とは別に、プロジェクトに使用するデータベースをセットアップする必要があります。 これがEMPであり、同じデータベース内のテーブルEmployeesに作成したと仮定します。
JDBCアプリケーションの作成:
このチュートリアルでは、JDBCアプリケーションの構築に関連する6つのステップを簡単に説明します。
パッケージをインポートします。
これには、データベースプログラミングに必要なJDBCクラスを含むパッケージを含める必要があります。 ほとんどの場合、次のようにimport java.sql。*を使用するだけで十分です。
//STEP 1. Import required packages
import java.sql.*;
JDBCドライバーを登録します。
これには、データベースとの通信チャネルを開くことができるように、ドライバーを初期化する必要があります。 これを実現するためのコードスニペットを次に示します。
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
接続を開きます。
これには、DriverManager.getConnection()メソッドを使用してConnectionオブジェクトを作成する必要があります。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オブジェクトには、例外に関する追加情報を取得するために使用できる次のメソッドがあります。
Method | Description |
---|---|
getErrorCode( ) | Gets the error number associated with the exception. |
getMessage( ) | Gets the JDBC driver’s error message for an error handled by the driver or gets the Oracle error number and message for a database error. |
getSQLState( ) | Gets the XOPEN SQLstate string. For a JDBC driver error, no useful information is returned from this method. For a database error, the five-digit XOPEN SQLstate code is returned. This method can return null. |
getNextException( ) | Gets the next Exception object in the exception chain. |
printStackTrace( ) | Prints the current exception, or throwable, and its backtrace to a standard error stream. |
printStackTrace(PrintStream s) | Prints this throwable and its backtrace to the print stream you specify. |
printStackTrace(PrintWriter w) | Prints this throwable and its backtrace to the print writer you specify. |
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 |
BIT | boolean | setBoolean | updateBoolean |
NUMERIC | java.math.BigDecimal | setBigDecimal | updateBigDecimal |
TINYINT | byte | setByte | updateByte |
SMALLINT | short | setShort | updateShort |
INTEGER | int | setInt | updateInt |
BIGINT | long | setLong | updateLong |
REAL | float | setFloat | updateFloat |
FLOAT | float | setFloat | updateFloat |
DOUBLE | double | setDouble | updateDouble |
VARBINARY | byte[ ] | setBytes | updateBytes |
BINARY | byte[ ] | setBytes | updateBytes |
DATE | java.sql.Date | setDate | updateDate |
TIME | java.sql.Time | setTime | updateTime |
TIMESTAMP | java.sql.Timestamp | setTimestamp | updateTimestamp |
CLOB | java.sql.Clob | setClob | updateClob |
BLOB | java.sql.Blob | setBlob | updateBlob |
ARRAY | java.sql.Array | setARRAY | updateARRAY |
REF | java.sql.Ref | SetRef | updateRef |
STRUCT | 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 |
BIT | boolean | setBoolean | getBoolean |
NUMERIC | java.math.BigDecimal | setBigDecimal | getBigDecimal |
TINYINT | byte | setByte | getByte |
SMALLINT | short | setShort | getShort |
INTEGER | int | setInt | getInt |
BIGINT | long | setLong | getLong |
REAL | float | setFloat | getFloat |
FLOAT | float | setFloat | getFloat |
DOUBLE | double | setDouble | getDouble |
VARBINARY | byte[ ] | setBytes | getBytes |
BINARY | byte[ ] | setBytes | getBytes |
DATE | java.sql.Date | setDate | getDate |
TIME | java.sql.Time | setTime | getTime |
TIMESTAMP | java.sql.Timestamp | setTimestamp | getTimestamp |
CLOB | java.sql.Clob | setClob | getClob |
BLOB | java.sql.Blob | setBlob | getBlob |
ARRAY | java.sql.Array | setARRAY | getARRAY |
REF | java.sql.Ref | SetRef | getRef |
STRUCT | java.sql.Struct | SetStruct | getStruct |
JDBC-バッチ処理:
バッチ処理を使用すると、関連するSQLステートメントをバッチにグループ化し、データベースへの1回の呼び出しでそれらを送信できます。
複数のSQLステートメントを一度にデータベースに送信すると、通信オーバーヘッドの量が減り、パフォーマンスが向上します。
- この機能をサポートするためにJDBCドライバーは必要ありません。 _DatabaseMetaData.supportsBatchUpdates()_メソッドを使用して、ターゲットデータベースがバッチ更新処理をサポートしているかどうかを判断する必要があります。 JDBCドライバーがこの機能をサポートしている場合、メソッドはtrueを返します。
- Statement、PreparedStatement、、および_CallableStatement_の* addBatch()*メソッドは、個々のステートメントをバッチに追加するために使用されます。 * executeBatch()*は、グループ化されたすべてのステートメントの実行を開始するために使用されます。
- * executeBatch()*は整数の配列を返し、配列の各要素はそれぞれの更新ステートメントの更新カウントを表します。
- 処理のためにステートメントをバッチに追加できるように、* clearBatch()*メソッドを使用してステートメントを削除できます。 このメソッドは、addBatch()メソッドで追加したすべてのステートメントを削除します。 ただし、削除するステートメントを選択的に選択することはできません。
JDBC-ストリーミングデータ:
PreparedStatementオブジェクトには、入力および出力ストリームを使用してパラメーターデータを提供する機能があります。 これにより、CLOBやBLOBデータ型などの大きな値を保持できるデータベース列にファイル全体を配置できます。
データのストリーミングに使用できる次のメソッドがあります。
- * setAsciiStream():*このメソッドは、大きなASCII値を提供するために使用されます。
- * setCharacterStream():*このメソッドは、大きなUNICODE値を提供するために使用されます。
- * setBinaryStream():*このメソッドは、大きなバイナリ値を提供するために使用されます。
setXXXStream()メソッドには、パラメータープレースホルダーに加えて、追加のパラメーターであるファイルサイズが必要です。 このパラメーターは、ストリームを使用してデータベースに送信するデータの量をドライバーに通知します。
これらすべての概念の詳細については、完全なチュートリアルを完了する必要があります。