まず、概念
1.データベース内の手術台上で動作するデータベースプログラムを行うために、各データベースは、データベースの駆動接続及び動作を提供し、各データベース・ドライバは、MySQL MySQLデータベースドライバを使用して、例えば、同じではありません、オラクルのドライブを使用してOracleデータベース、我々はあなたがデータベースを変更したい日のプログラムを書く場合、それは、非常に簡単になりますので、データベースに接続するすべてのコードを書き換えなければならないからです。簡単にするためにSUN会社。統一されたデータベースの操作、または仕様は、Javaデータベース操作の標準セットを定義し、この仕様はJDBCです。
2.JDBCフルネーム:Javaデータベースコネクティビティ(Java Database Connectivity)は、それが主にインターフェイスで構成されています。私たちは、開発プロセスでは、限り、あなたは実感としては、接続するために非常に適切なインターフェイスすることができます。
3.私たちは、JDBCアプリケーションを開発するだけでなく、ときに適切なデータベースドライバのjarパッケージをインポートする必要があり、これらのドライバのjarパッケージは、同社の独自のデータベースによって書かれています。
第二に、前提は、JDBCアプリケーション(プログラムがデータベースに接続する必要がある)の準備を書きます
1.接続されているデータベースインスタンスを決定するために、まず、例えば、mysqlは、我々はその後、テーブル内のいくつかのデータを挿入するために、ライブラリ内のテーブルを作成し、データベースを作成することができ、私はいくつかは、MySQLデータベースに作成提供するために、ここにいます以下の表およびデータベースリポジトリ操作に接続されているライブラリ、およびテーブルとデータのSQL文、。
データベースのテストを作成する; / * * / Testという名前のデータベースを作成し テストを使用; / *データベースにデータベースを使用するか、切り替え* / 表の作成ブック( ID int型主キーAUTO_INCREMENT、/ *コラム:ID、タイプ:INT 0から始まり、自動的に増加し、注:プライマリキー* / 名VARCHAR(40)NOT NULL、/ *列:名前、タイプ:VARCHAR、注:非空* / 著者VARCHAR(40)NOT NULL、/ *コラム:著者、タイプ:VARCHAR、注:非空* / 価格ダブル、NOT NULL / *列:価格、タイプ:ダブル、注:非空では、* / ); / *書籍* /という名前のテーブルを作成 / * 4を挿入します有名なデータ* / INSERT INTOブック(ID、名前、著者、価格)の値(nullで、 '西遊記'、 'WuChengEn'、25.00); INSERT INTOブック(ID、名前、著者、価格)の値(NULL、 "水滸伝''竹刀'30.00); INSERT INTOブック(ID、名前、著者、価格)の値(nullで、'レッドの夢''曹雪芹」、35。00)。 INSERT INTOブック(ID、名前、著者、価格)の値(nullで、'三国志、 '羅貫中'、40。00)。
2.それは、ライブラリプログラムに追加され実行されて、入って来Javaプロジェクトを作成し、MySQLドライバのjarパッケージをインポートし、特定のドライバjarパッケージには、我々は、インストールディレクトリデータベースで検索したり、あなた自身のオンラインダウンロードが対応することができますデータベースドライバのjarパッケージ
第三に、データベース操作の分析を接続する工程
(1)登録データベースドライバ
我々は、単にJavaのjarファイルのパッケージmysqlデータベースのインポートを駆動する新しいプロジェクトの時に来ているが、JBDCは知りませんが、我々は、それを管理するためにJBDCに、このドライバパッケージを必要とし、ドライバパッケージがあり、私たちは、Javaを使用することができます。 SQLパッケージ内のDriverManagerツールは、JDBC、このデータ駆動型を登録するなregisterDriver(ドライバドライバ)の方法を提供し、このようなregisterDriver(駆動ドライバ)メソッドは、ドライバオブジェクトを必要とし、ドライバクラス自体は、JDBCによって提供されるインタフェースであり、私たちこのインタフェースを実装駆動となっていた、私たちはただ、次のコードを記述する必要が登録データベース駆動型の機能性を達成することができます
インポートのjava.sql.DriverManagerは; //インタフェースクラスをインポートするパッケージ にDriverManager.registerDriver(新しいドライバ());
(2)取得(作成)データベース接続
私たちは、データベースに接続するためのJavaプログラムも例外ではありません、過去に、我々は、データベースを操作するために視覚的なデータベース管理ツールを通じて、CMDウィンドウに気にしない、私たちは、データベース・サーバーに接続する必要があり、優れたデータベース駆動型を登録し、データベースに接続していない、ここでのJavaをプログラムは、クライアントに相当し、唯一のデータベースを操作するためにデータベース・サービスに接続します
クライアントは、すべての接続オブジェクトが達成されてデータベースと対話し、一般的に、このオブジェクトのメソッドを使用します:
createStatement():データベースに送信されたオブジェクトのSQL文を作成します。
prepareStatement(SQL):データベースに送信されたプリコンパイル作成するSQL
ここでは、このgetConnectionでのDriverManagerツール(URL、ユーザー、パスワード)メソッドを介してデータベース接続オブジェクトを作成することができ、この方法は、3つの引数が必要です。
ユーザー:データベースのユーザー名
パスワード:ユーザーのパスワード
URL:データベースサーバーアドレス、URL異なる言い回し異なるデータベース、私はここ3つの主流データベースを書かれたURLアドレスを提供します。
オラクル写法ます。jdbc:oracle:thin:@localhost:1521:SID
SqlServe写法ます。jdbc:マイクロソフト:のSQLServer:// localhostを:1433; データベース名= SID
MySQLの文言ます。jdbc:mysqlの:// localhostを:3306 / SID
MySQLのの短縮URLアドレスします。jdbc:mysqlの:/// SID
注:次のSIDは、データベースのインスタンス名(データベース名が使用される)であります
インポートのjava.sql.Connection; //インタフェースクラスがインポートされたパッケージ 接続CONN =たDriverManager.getConnection( "JDBC: MySQLの:// localhostを:3306 /テスト"、 "ルート"、 "ルート"); // 本明細書MySQLデータベース、ユーザー名とパスワードは、rootという名前のテストされています
(3)トランスポート・オブジェクトを作成します
私たちは、すでにデータベースに接続されたデータベースへの接続を作成しているが、我々は、データベースを操作したい場合は、我々は、SQLステートメントを使用する必要がある、と私たちはJavaプログラムにSQL文を使うのですか、まだデータベースを操作するために私たちはここにオブジェクトは、実行するためにデータベースにSQL文を送信する送信機を必要とします。上記のcreateStatement、転送オブジェクトを作成するクラス接続()メソッドがあります
輸入java.sql.Statementの; //インタフェースクラスがインポートされたパッケージ 声明STAT = conn.createStatement();
(4)結果と結果セットを返す、操作を実行するためにデータベースにSQL文を送信した送信対象物を使用して
最も使用されている:SQL文を転送する多くの方法によりjava.sql.Statementがあります。
executeQuery(文字列のSQL):データにクエリを送信します。
executeUpdate(文字列のSQL):挿入、更新、またはステートメントを削除するために、データベースを送信します
(文字列のSQL)を実行します。データベースにSQL文を送信するために使用
インポートのjava.sql.ResultSet; //インタフェースクラスがパッケージインポートする (「選択* = stat.executeQueryをResultSetのRSを本から」); // クエリを送信し、クエリデータは、すべてのタプル帳テーブルがあります
(5)結果セットを横断し、クエリオブジェクトを取得
ResultSetの結果を実行するためのJDBCプログラムは、SQL文を表します。ResultSetがパッケージ化すると結果が収集され、テーブルと同様の方法を。ResultSetオブジェクトは、データテーブルの行へのポインタを維持するカーソル、初期時間を、カーソルの最初の行の前に、ResultSet.nextの呼び出し()メソッド、カーソルが特定のデータ線に向けることができるように、メソッド呼び出しラインデータ取得。
ResultSetの実行結果を包装するので、データの取得を取得するための方法を提供することを目的とします。
例えば、データの指定されたタイプを取得します。
getString(int型のインデックス)
getString(文字列COLUMNNAME)
ResultSetがまた、結果セットのローリングのための方法を提供します。
次の():次の行に移動
前の():前の行に移動
絶対(INT行):特定の行に
beforeFirstの():モバイルたresultSetの目の前。
afterLastの():最後尾に移動したresultSet。
(rs.next())、一方 { 文字列名= rs.getString( "名"); System.out.println(名); }
(第1の閉作成後)(6)接続を閉じます
JDBCプログラムは、実行されたデータベースと対話しているものが作成された、操作でプログラムを解放するために覚えているこれらのオブジェクトは、通常のResultSet、ステートメント、および接続オブジェクトであるとして。
タイムリーではない接続、右の近くには、簡単にシステムのダウンタイムにつながることができれば、特定のConnectionオブジェクトでは、それは非常に希少な資源である、使用後はすぐに解放されなければなりません。使用教義接続が可能な早期リリース限り、できるだけ遅くに作成されます。
rs.close(); stat.close(); conn.close();
初期の完全なソースコード
パッケージjdbcDemo 1; 2 / **************************** 。3 *初版プログラムデータベースに接続された 4 ********* ******************************************************** / 5インポートのjava.sql.Connection; 6インポートのjava.sql.DriverManager; 7インポートのjava.sql.ResultSet; 8インポートjava.sql.SQLExceptionという。 java.sql.Statementのインポート9; 10 //のみデータベース対応するドライバに登録するために、ドライバjarパッケージインタフェースの実装クラスをインポートするために、java.sqlのドライバインターフェースに導入することができない 11インポートcom.mysql.jdbcを.Driver; 12 {publicクラスてJDBCTestである 13は、パブリック静的な無効メイン(文字列[]引数)でのSQLException {スロー 。14 //登録データベースドライバ1 15にDriverManager.registerDriver(新しい新しいドライバ())を、 。データベース16 // 2接続アクセス たDriverManager.getConnection接続CONN = 17( "JDBC:MySQLの:// localhostの:? 3306 / useSslオプションテスト= FALSE"、 "ルート"、 "ルート"); 18 3 //トランスポート・オブジェクトの作成。 19ステートメントSTAT = CONNを。 createStatement(); 20 //で4操作を実行するためにデータベースに転送オブジェクト転送SQLステートメントを使用して、結果セットから返された結果。 21がResultSet stat.executeQueryのRSである=(「帳からSELECT *」); 。。トラバースされる22 5 //結果セット、および検索結果取得 部23は、一方(rs.next()){で 24 rs.getString文字列名=( "名前"); 25のSystem.out.println(名前); 26れる} 。27 //接続を閉じる6(最初のオフを開いた後) 28 rs.Close(); 29 stat.close(); 30はconn.close(); 31である} 32}
データシートビューと実行結果:
第四に、初期のデータベース接続の問題は、プログラムに表示されます
1--登録データベース駆動型の方法が原因汎用性の低い不適切な登録手続きに2回表示します
我々は7行のコードから見ることができ、ソース・ビュー・ドライバ・クラスに次のコードを見ることができ、一度自分自身を登録するために実現ドライバクラスでのMySQL、そして我々は2回の登録で、その結果、一度プログラムに登録しています二次
私たちはあなたのドライブを登録するときは、プログラムと、特定のデータベースが一緒にバインドするようにmysqlのドライバのドライバクラスのjarパッケージは、達成されたインポートする必要があり、プログラムの汎用性が低くなる、我々はデータベースを切り替えたい場合は、変更する必要がソース
1つのパブリッククラスドライバはNonRegisteringDriverは{に、java.sql.driverを実装延び 2 // 3 //のDriverManagerで自分自身を登録し 4 // 5静的{ 6試み{ 7 java.sql.DriverManager.registerDriver(新しいドライバ())。 8}キャッチ(のSQLException E){ 9スロー新しいのRuntimeException( "ドライバを登録することはできません!"); 10} 11}
修理方法:
使用Class.forNameの() クラスMySQLドライバの方法は、既に、すなわち、コードの静的ブロックに使用されるインターフェースを実装によるDriverクラス、およびコードの静的ブロックは、クラスがロードされる時に1回だけ実行され、プログラムにロードされた実施しましたデータベースドライバは一度だけ登録されることを保証するために、およびMySQLのクラスパッケージをインポートするために、ドライブには運転しない、汎用性の高いプログラムを改善するために、
Class.forNameの( "はcom.mysql.jdbc.Driver");
例外(最大の問題を)投げるかもしれプログラムを無視2--
プログラムの実装では私たちは、それが例外をスローした場合、そのメソッド呼び出しの多くは、例外をスローし、適切な治療をしなかった(この例外をキャッチ)し、プログラムの実行、StatementオブジェクトとConnectionオブジェクトを中断しますが閉じられていませんそして我々は、Connectionオブジェクトは、それがタイムリーでない接続は、右の近くに、簡単にシステムのダウンタイムにつながることができれば、それは、使用後はすぐに解放されなければならない非常に希少な資源であることを知って、私たちは、プロシージャ内がどのステップが異常につながることを確認する必要がありますプログラムの中断が、接続は、閉じられたコードが実行されますされ、その後、我々は中に例外処理を考えるだろう最後に、我々はアップ例外をスローしますが、最初にすることができますブロック しようとし 、その後生きるとする キャッチし た例外を、最後の実行 最後に ブロック
変更後、我々は)(各近いが、治療すべき異常を示唆している、と我々はまた、直接ことがわかっ キャッチ/試みる 各例外を
修飾されたソースコード:
パッケージjdbcDemo 1; 2 / **************************** *データベースプログラムの修正版に接続3。 4 ******** ************************************************** / 5インポートのjava.sql.Connection; 6インポートのjava.sql.DriverManager; 7インポートのjava.sql.ResultSet; 8インポートます。java.sql.SQLException ; 9インポートjava.sql.Statementの; 10 。11 {publicクラスてJDBCTest 12のpublic static無効メイン(文字列[] args){さ 13は、コネティカット接続= NULLである; 14ステートメントSTAT = NULL; 15個のResultSet RS = NULL; 16 {試し 17 /。 。/ 1ドライバ登録データベース 18にClass.forName( "はcom.mysql.jdbc.Driver")である .. 19 // 2接続データベースを得るために たDriverManager.getConnection CONN = 20( ":MySQLの:// localhostを:JDBCは?3306 / useSslオプションテスト= FALSE"、 "ルート"は、 "ルート"); 21 // 3は、トランスポート・オブジェクトを作成する 22 STAT = conn.createStatement( ); 23 // 4は、データベース操作への転送対象のSQLステートメントを使用して送信を行い、結果セットは、結果と共に返される 。)「予約SELECT * FROM」(= 24 stat.executeQueryのRS 、結果セットトラバース.. 5 // 25及びクエリ結果の取得 26と、(rs.next()){つつある 27 rs.getString文字列名=( "名前"); 28のSystem.out.println(名前); 29} 30}キャッチ(例外E){ 31がEです。 printStackTrace(); 32} {最後に 33 //である6。(最初の開封後オフ)接続を閉じます 34試み{ 35 rs.close()。 36}キャッチ(のSQLException E){ 37 e.printStackTrace(); 38} 39のtry { 40 stat.close()。 41}キャッチ(のSQLException E){ 42 e.printStackTrace(); 43} 44のtry { 45はconn.close(); 46}キャッチ(のSQLException E){ 47 e.printStackTrace(); 48} 49} 50} 51}
第五に、改訂されたプログラムの例外は無視されます
珍しい問題
1.私たちは、最初のプログラムの冒頭で宣言した3つのオブジェクトを参照し、nullに割り当てられているので、登録データベースへのプログラムの実装では、このステップは例外をスローした場合、最終的に例外をキャッチするためにブロックし、ヌルStatementオブジェクトであり、ResultSetオブジェクトが参照することを発見し、そして参考文献は、Connectionオブジェクトを引用し、このオブジェクトのメソッドを呼び出すことは、ヌルポインタ例外をスロー
2. 使用閉じる()これも異常である方法、我々は適切な例外処理をしない場合、または適切に閉じることができないオブジェクト
ソリューション
1 ---ヌルポインタ例外を防ぐために、我々は最初のヌル、そうでない場合はnullで参照されるオブジェクトは、例外処理コードが実行されているか否かを判断することができます
2 ---各(クローズ)を加え、最終的に静的ブロック、それぞれのオブジェクトの基準値は、例外処理後にNULLに設定されているが、原理は:プログラムを閉じるように実行された場合()メソッドは例外をスローし、 、最後に実行をブロックの最後には、アプリケーションオブジェクトに値を設定したオブジェクトは、それを指す参照がありません、それはゴミオブジェクトとなり、JVMのガベージコレクタは、オブジェクトのリソースを再利用しますので、nullの場合、このオブジェクトは終了しますインクルード
最後のソースコードの後に例外処理:
パッケージjdbcDemo 1; 2 / **************************** 3 *異常な接続のデータベースプログラムのバージョン。 4 ******* ******************* / 5インポートのjava.sql.Connection; 6インポートのjava.sql.DriverManager; 7インポートのjava.sql.ResultSet; 8インポートのjava.sql。 SQLException; 9インポートjava.sql.Statementの; 10 。11 {publicクラスてJDBCTest 12は、パブリック静的無効メイン(文字列[] args){である ; 13はコネチカット接続= nullである =ヌル14ステートメントSTAT; 15個のResultSet RS = NULL; 16 {試し 17。 //登録データベースドライバ1 18にClass.forName(「はcom.mysql.jdbc.Driver」)である; ... // 2 19接続データベースを得るために たDriverManager.getConnection CONN = 20( ":MySQLの:// localhostを:JDBCは?3306 / useSslオプションテスト= FALSE"、 "ルート"は、 "ルート"); 21 // 3は、トランスポート・オブジェクトを作成する 22 STAT = conn.createStatement( ); 23 // 4は、データベース操作への転送対象のSQLステートメントを使用して送信を行い、結果セットは、結果と共に返される 。)「予約SELECT * FROM」(= 24 stat.executeQueryのRS 、結果セットトラバース.. 5 // 25及びクエリ結果の取得 26と、(rs.next()){つつある 27 rs.getString文字列名=( "名前"); 28のSystem.out.println(名前); 29} 30}キャッチ(例外E){ 31がEです。 printStackTrace(); 32} {最後に 33 //である6。(最初の開封後オフ)接続を閉じます 34(RS = NULL!){もし 35試み{ 36 rs.close()。 37}キャッチ(のSQLException E){ 38 e.printStackTrace(); 39}最後に{ 40、RS = NULL; 41} 42} 43 IF(!STAT = NULL){ 44のtry { 45 stat.close()。 46}キャッチ(のSQLException E){ 47 e.printStackTrace(); 48}最後に{ 49 STAT = NULL; 50} 51} 52場合(connの= NULLを!){ 53のtry { 54はconn.close(); 55}キャッチ(のSQLException E){ 56 e.printStackTrace(); 57}最後に{ 58 CONN = NULL; 59} 60} 61} // -最終的に 62} // -主要 63} // -クラス
要約:
ここでは、私はちょうど処理されたすべての異常を置くが、プログラムの汎用性が特に高くない使用するデータベース接続のドライバクラス名、URL、ユーザー名とパスワードは、プログラムに書かれているので、我々は実際にテキストファイルに書き込むことができます各ファイルを読み込むことで、データベース固有の接続パラメータを取得します。
私たちは、データベース内のデータを操作したいとき、実際の開発プロセスがあり、データベースに接続するためのプログラム・コードは、一般的に、クラスのツールを書きますいつも書いていない、それだけで、このツールのクラスを呼び出す必要があります非常に多くのコード
次に、私は、テキストファイルに格納されている情報のデータベースを接続し、作動データベースに結合するために、このファイルを読み取る方法を更新しますが、私はまた、データベースツールへの接続を変更するには、このプログラムがかかります