Javaデータベースコネクティビティ

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
JDBC
開発者オラクル株式会社
安定リリース
JDBC 4.3 / 2017年9月21日 (2017-09-21
オペレーティング・システムクロスプラットフォーム
タイプデータアクセスAPI
WebサイトJDBCAPIガイド

Java Database ConnectivityJDBC)は、プログラミング言語Java用のアプリケーションプログラミングインターフェイス(API)であり、クライアントがデータベースにアクセスする方法を定義しますこれは、Javaデータベース接続に使用されるJavaベースのデータアクセステクノロジーです。これは、OracleCorporationのJavaStandardEditionプラットフォームの一部ですこれは、データベース内のデータをクエリおよび更新するためのメソッドを提供し、リレーショナルデータベースを対象としていますJDBCからODBCへのブリッジにより、 Java仮想マシン(JVM)ホスト環境 内のODBCアクセス可能なデータソースへの接続が可能になります。

歴史と実装

Sun Microsystemsは、1997年2月19日にJava Development Kit (JDK)1.1の一部としてJDBCをリリースしました。 [1] それ以来、JDBCはJava Platform、Standard Edition(Java SE)の一部となっています。

JDBCクラスは、Javaパッケージ java.sqlとに含まれていますjavax.sql

バージョン3.1以降、JDBCはJava CommunityProcessの下で開発されました。JSR54はJDBC3.0(J2SE 1.4に含まれる)を指定し、JSR 114はJDBC行セットの追加を指定し、JSR221はJDBC4.0(Java SE 6に含まれる)の仕様です。[2]

JDBC 4.1は、JSR 221 [3]のメンテナンスリリース1で指定されており、Java SE7に含まれています。[4]

JDBC 4.2は、JSR 221 [5]のメンテナンスリリース2で指定されており、Java SE8に含まれています。[6]

最新バージョンのJDBC4.3は、JSR 221のメンテナンスリリース3 [7]で指定されており、Java SE9に含まれています。[8]

機能性

JDBC( 'Java Database Connectivity')を使用すると、複数の実装が存在し、同じアプリケーションで使用できます。APIは、正しいJavaパッケージを動的にロードし、それらをJDBC DriverManagerに登録するためのメカニズムを提供します。Driver Managerは、JDBC接続を作成するための接続ファクトリとして使用されます。

JDBC接続は、ステートメントの作成と実行をサポートします。これらは、SQLのCREATEINSERTUPDATEDELETEなどの更新ステートメントの場合もあれば、 SELECTなどのクエリステートメントの場合もありますさらに、ストアドプロシージャは、JDBC接続を介して呼び出すことができます。JDBCは、次のクラスのいずれかを使用してステートメントを表します。

INSERT、UPDATE、DELETEなどの更新ステートメントは、データベースで影響を受けた数を示す更新カウントを返します。これらのステートメントは、他の情報を返しません。

クエリステートメントは、JDBC行の結果セットを返します。行の結果セットは、結果セットをウォークオーバーするために使用されます。行の個々のは、名前または列番号のいずれかで取得されます。結果セットには任意の数の行が含まれる可能性があります。行の結果セットには、列の名前とそのタイプを説明するメタデータが含まれています。

には、基本的なJDBCAPIの拡張機能がありますjavax.sql

JDBC接続は、多くの場合、ドライバーから直接取得するのではなく 、接続プールを介して管理されます。

Javaが関数で変換できるホストデータベースタイプ
Oracleデータ型 setXXX()メソッド
CHAR setString()
VARCHAR2 setString()
番号 setBigDecimal()
setBoolean()
setByte()
setShort()
setInt()
setLong()
setFloat()
setDouble()
整数 setInt()
浮く setDouble()
CLOB setClob()
BLOB setBlob()
setBytes()
LONGRAW setBytes()
日にち setDate()
setTime()
setTimestamp()


Javaアプリケーションでデータベース接続が必要な場合は、いずれかのDriverManager.getConnection()方法を使用してJDBC接続を作成します。使用されるURLは、特定のデータベースとJDBCドライバーによって異なります。常に「jdbc:」プロトコルで始まりますが、残りは特定のベンダー次第です。

接続 conn  =  DriverManager getConnection 
     "jdbc:somejdbcvendor:一部のjdbcベンダーが必要とするその他のデータ" 
     "myLogin" 
     "myPassword" ); 
try  { 
     / *ここで接続を使用します* / 
} 最後に { 
    //接続が終了したら接続を閉じることが重要です
    try  {  
        conn close (); 
    }  catch  Throwable  e  { / *                                 ログに記録したいこの例外の代わりに、元の例外を伝播します* /
 
        ロガー警告"JDBC接続を閉じることができませんでした" e ); 
    } 
}

Java SE 7以降では、Javaのtry-with-resourcesステートメントを使用して、上記のコードを単純化できます。

try  Connection  conn  =  DriverManager。getConnection " jdbc: somejdbcvendor :jdbcベンダーが必要とするその他のデータ" "myLogin" "myPassword" )){ / *ここで接続を使用します* / } // VMが処理します接続を閉じる
     
     
      
     
  

接続が確立されると、ステートメントを作成できます。

try  ステートメント stmt  =  conn。createStatement { stmt executeUpdate "INSERT INTO MyTable(name)VALUES( 'my name')" ); } 
    

Connections、Statements、およびResultSetsは、ソケットやファイル記述子などのオペレーティングシステムリソースを拘束することが多いことに注意してくださいリモートデータベースサーバーへの接続の場合、サーバー上でさらにリソースが拘束されます。たとえば、現在開いているResultSetのカーソルなどです。JDBCオブジェクトがその役割を果たすとすぐに、 それは重要です。ガベージコレクションは信頼されるべきではありません。上記のtry-with-resources構造は、これを回避するコードパターンです。 close()

データは、データベースクエリメカニズムを使用してデータベースから取得されます。次の例は、ステートメントの作成とクエリの実行を示しています。

try  ステートメント 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のドキュメント//を参照してください。
           システムアウトprintln "COLUMN" + i + "=" + rs。getObject i ; } } }
                  
        
    

最初の例のクラス を使用しPreparedStatementクエリの例。conn

try  PreparedStatement  ps  = 
    conn。prepareStatement ( "SELECT i *、j。* FROM Omega i、Zappa j WHERE i.name =?AND j.num =?" { //準備中のSQLステートメントでは、それぞれ疑問符はプレースホルダーであり、 //「set」メソッドの呼び出しで指定した値に置き換える必要があります。//次の2つのメソッド呼び出しは、2つのプレースホルダーを置き換えます。1つ目は//文字列値に置き換えられ、2つ目は整数値に置き換えられます。ps setString 1 "Poor Yorick" ); ps setInt 2
 
    
    
    
    
     
     8008 );

    // ResultSet rsは、SQLステートメントの実行結果を伝達します。
    // rs.next()、内部行ポインタ、またはカーソルを呼び出すたびに、
    //結果の次の行に進みます。//カーソルは
    、最初の行の前に//配置されます。
    try  ResultSet  rs  =  ps。executeQuery { while rs。next { int numColumns = rs getMetaData ()。getColumnCount (); for int i = 1 ; i 
          
               
                  <=  numColumns ;  i ++  { 
                //列番号は1から始まります。//また
                、特定のタイプとして列を返す//結果セットには多くのメソッドがあります。
                有効な変換のリストについては、Sunのドキュメント//を参照してください。
                システムアウトprintln "COLUMN" + i + "=" + rs。getObject i ; } // for } // while } // try } // try
                      
             
         
     
 

データベース操作が失敗した場合、JDBCは。を発生させますSQLException可能な限り詳細にログを記録することを除けば、通常、このようなエラーから回復するためにできることはほとんどありません。SQLExceptionをアプリケーションドメイン例外(チェックされていない例外)に変換して、最終的にトランザクションのロールバックとユーザーへの通知を行うことをお勧めします。

データベーストランザクションの例

boolean  autoCommitDefault  =  conn getAutoCommit (); 
{ connを試してください setAutoCommit false );
    

    / *ここでトランザクションに対してconnに対してステートメントを実行します* /

    conn コミット(); 
}  catch  Throwable  e  { 
    try  {  conn ロールバック();  }  catch  Throwable  e  {  logger 警告「トランザクションをロールバックできませんでした」 e );  } 
    throw  e ; 
} 最後に { 
    try  {  conn setAutoCommit autoCommitDefault );  }  catch  Throwable e  { ロガー警告"AutoCommit設定を復元できませんでした" e );  } 
}

CallableStatement(データベース内のストアドプロシージャを呼び出すための)例については、 JDBCAPIガイドのドキュメントを参照してください。

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

public  class  Mydb1  { 
   static  String  URL  =  "jdbc:mysql:// localhost / mydb" ;

   public  static  void  main String []  args  { 
      try  { 
        Class forName "com.mysql.jdbc.Driver" );

        接続 conn  =  DriverManager getConnection URL  "root"  "root" ); 
        ステートメント stmt  =  conn createStatement ();
      
        String  sql  =  "INSERT INTO emp1 VALUES( 'pctb5361'、 'kiril'、 'john'、968666668)" ; 
        stmt executeUpdate sql );
           
        システムアウトprintln "テーブルにレコードを挿入しました..." ); 
      }  catch  例外 e  { 
        e printStackTrace (); 
      } 
   } 
}


JDBCドライバー

JDBCドライバーは、Javaプログラムからの要求をDBMSが理解できるプロトコルに変換するクライアント 側アダプター(サーバーではなくクライアントマシンにインストールされます)です。

タイプ

商用および無料のドライバーは、ほとんどのリレーショナルデータベースサーバーへの接続を提供します。これらのドライバーは、次のいずれかのタイプに分類されます。

  • ローカルで利用可能なODBCドライバーのネイティブコードを呼び出すタイプ1 。(注:JDBC 4.2では、JDBC-ODBCブリッジが削除されました[9]) 。
  • クライアント側でデータベースベンダーのネイティブライブラリを呼び出すタイプ2 。次に、このコードはネットワークを介してデータベースと通信します。
  • タイプ3、サーバー側ミドルウェアと通信する純粋なJavaドライバーで、データベースと通信します。
  • タイプ4、データベースネイティブプロトコルを使用するpure-javaドライバー。

内部JDBCドライバーと呼ばれるタイプにも注意してください。これは、Java対応のSQLデータベースにJREが組み込まれているドライバーです。Javaストアドプロシージャに使用されますこれは上記の分類スキームには適合しませんが、タイプ2またはタイプ4のドライバーに似ている可能性があります(データベース自体がJavaで実装されているかどうかによって異なります)。この例は、Oracle RDBMS で提供されるKPRB(Kernel Program Bundled)ドライバー[10]です。「jdbc:default:connection」は、そのような接続を確立するための比較的標準的な方法を提供します(少なくともOracleデータベースとApache Derbyそれをサポートします)。ただし、内部JDBCドライバーの場合、JDBCクライアントは実際にはアクセスされるデータベースの一部として実行されるため、ネットワークプロトコルを介さずに直接データにアクセスできます。

ソース

  • Oracleは、いくつかのJDBCドライバーとベンダーのリストを提供しています
  • Simba Technologiesは、カスタム/プロプライエタリリレーショナルデータソース用のカスタムJDBCドライバーを構築するためのSDKを出荷しています
  • CData Softwareは、さまざまなアプリケーション、データベース、およびWebAPI用のタイプ4JDBCドライバーを出荷しています。[11]
  • アプリケーション、データベース、およびWebサービス用のRSSBusタイプ4JDBCドライバー[12]
  • DataDirect Technologiesは、タイプ5としてアドバタイズするすべての主要データベースに高速タイプ4JDBCドライバーの包括的なスイートを提供します[13]。
  • IDSソフトウェアは、すべての主要なデータベースに同時にアクセスするためのタイプ3JDBCドライバーを提供します。サポートされている機能には、結果セットのキャッシュ、SSL暗号化、カスタムデータソース、dbShieldが含まれます
  • JDBaccessは、MySQLおよびOracle用のJava永続ライブラリであり、JDBCよりも使いやすいAPIで主要なデータベースアクセス操作を定義します。
  • JNetDirectは、完全にSunJ2EE認定の高性能JDBCドライバーのスイートを提供します。
  • JDBCR4は、 IBMi上のRPGからJDBCへのアクセスを可能にするためにScottKlementによって作成されたサービスプログラムです[14]
  • HSQLDBは​​、JDBCドライバーを備えたRDBMSであり、BSDライセンスの下で利用できます。
  • SchemaCrawler [15]は、JDBCを活用するオープンソースAPIであり、データベースメタデータをプレーンオールドJavaオブジェクト(POJO)として利用できるようにします。

も参照してください

参考文献

  1. ^ 「SunShipsJDK 1.1 --Javabeansが含まれています」www.sun.comサンマイクロシステムズ1997-02-19。2008-02-10にオリジナルからアーカイブされました2010年2月15日取得1997年2月19日-JDK1.1 [...]が利用可能になりました[...]。このリリースのJDKには、次のものが含まれます。[...]データベース接続用のJDBCを含む堅牢な新機能
  2. ^ JDBC API仕様バージョン:4.0
  3. ^ 「JavaCommunityProcess(SM)プログラム-communityprocess-mrel」jcp.org 2018年3月22日取得
  4. ^ 「JDBC4.1」docs.oracle.com 2018年3月22日取得
  5. ^ 「JavaCommunityProcess(SM)プログラム-communityprocess-mrel」jcp.org 2018年3月22日取得
  6. ^ 「JDBC4.2」docs.oracle.com 2018年3月22日取得
  7. ^ 「JavaCommunityProcess(SM)プログラム-communityprocess-mrel」jcp.org 2018年3月22日取得
  8. ^ "java.sql(Java SE 9&JDK 9)"docs.oracle.com 2018年3月22日取得
  9. ^ 「JavaJDBCAPI」docs.oracle.com 2018年3月22日取得
  10. ^ Greenwald、Rick; Stackowiak、Robert; スターン、ジョナサン(1999)。Oracle Essentials:Oracle Database10gEssentialsシリーズ(3版)。カリフォルニア州セバストポル:O'Reilly Media、Inc。(2004年発行)。p。318. ISBN  97805960058562016年11月3日取得データベース内JDBCドライバー(JDBC KPRB) [:] Javaコードは、JDBC KPRB(カーネルプログラムバンドル)バージョンを使用して、同じサーバー上のSQLにアクセスします。
  11. ^ 「JDBCドライバー-CDataソフトウェア」CDataソフトウェア2018年3月22日取得
  12. ^ 「JDBCドライバー-CDataソフトウェア」CDataソフトウェア2018年3月22日取得
  13. ^ 「新しいタイプ5JDBCドライバー— DataDirectConnect」
  14. ^ 「JDBCR4Meatof theMatterを使用してRPGから外部データベースにアクセスする」2012年6月28日2016年4月12日取得
  15. ^ SualehFatehi。「SchemaCrawler」SourceForge

外部リンク