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()メソッドには、パラメータープレースホルダーに加えて、追加のパラメーターであるファイルサイズが必要です。このパラメーターは、ストリームを使用してデータベースに送信する必要があるデータの量をドライバーに通知します。

これらすべての概念の詳細については、完全なチュートリアルを実行する必要があります。