1.最初にJDBCとは何かを説明します
一見この名詞を見る前に、その完全な英語名が何であるかを知る必要があると感じました。 Javaデータベース接続は、文字通り接続可能なJavaデータベースに翻訳されています。率直に言って、Javaコードとデータベースを接続するための中間リンクのセットを提供して、Javaコードを操作してデータベースを直接制御できるようにしたいと思います。
2。JDBCの本質
データベースにアクセスするためのJavaソリューションです。特定のデータベースに関連しないJava操作インターフェイスを実現するために、同じ方法で異なるデータベースにアクセスしたいと考えています。
JDBCは、基本的に標準化されたインターフェイスのセットです。さまざまなデータベースメーカーは、独自のデータベース特性に従ってこのインターフェイスを実装しており、特定の実装方法に注意する必要はありません。
JDBCのデータベースメーカーによって実装される主なインターフェイスは次のとおりです。
Drivermanager:ドライバー管理
繋がり、
DatabaseMetadata:インターフェイスに接続します
声明、
準備された測定
callablestatement:ステートメントオブジェクトインターフェイス
結果セット、
Resultsetmetadata:結果のインターフェイス
3. JDBCの仕組み
プログラマーは、基礎となるデータベースメーカーによって実装された部品を呼び出します。
つまり、1)接続インターフェイスを介して接続の最初のステップを実装します
2)ステートメント結果を通じてSQLステートメントを転送します
3)データベースのリターン結果を結果セットセットインターフェイスに保存する主なプロセスは、次のように要約できます。
1)ドライバーをロードして接続を作成します
2)ステートメントオブジェクトを作成します
3)SQLステートメントを実行します
4)結果セットを送信します
5)接続を閉じます
以下に、JDBCの実装方法を説明する例として、私が学んだOracleデータベースをEclipsと協力します。
1)ドライバーのロード
使用される方法は次のとおりです。class.forname( "driver");
このドライバーを取得する方法について知っているのは、jdbc jarパッケージを展開し、ojdbc6.jarを使用する場合、oracle.jdbc.driverを見つけ、oracledriverを見つけてから、Qualitycopyを右クリックして、class.forname( "oracle.jdbc.driver.driver")などの引用符で貼り付けます。
2)接続を作成します
使用される方法は次のとおりです。Conn= DriverManager.getConnection( "JDBC:Oracle:Thin:@IPアドレス:1521:ORCL"、 "Database Account"、 "Database Password");
例:conn = drivermanager.getConnection( "jdbc:oracle:thin:@172.16.3.8:1521:orcl"、 "jsd1601"、 "jsd1601");
3)ステートメントオブジェクトを作成します
使用される方法は次のとおりです。ステートメントstmt = conn.createstatement();
2番目のステップで作成された接続は、メソッドを呼び出すために使用されることに注意する必要があります
executeUpdateメソッドを呼び出し、SQLステートメントをそれに渡して、書かれたSQLステートメントを実行します。ここで、executeUpdateメソッドが実行できるSQLのタイプは挿入、更新、削除です
例:ステートメントstmt = conn.createstatement();
string sql = "emp_jiawenzheに挿入(empno、ename、sal、deptno)値(1000、 'jia wenzhe'、1500,10)";
int i = stmt.executeupdate(sql);
ここで私が戻る値は、影響を受ける行の数です。影響を受ける行の数に基づいて、操作が成功しているかどうかを判断できます。
4)返された結果セットは、主に選択操作を指します(ここでは言及されていません)
5)最後に接続を閉じます
例:conn.close();
コメントを含むコード全体をリストします。
パッケージjdbc_day01; import java.sql。*;/*** jdbc* 1の操作手順を実証します。ドライバー* 2。接続*3。ステートメントオブジェクトの作成* 4。 args)sqlexception {//要件:従業員、従業員番号、従業員名、給与、部門番号// 1、接続conn = nullを作成します。 try {class.forname( "oracle.jdbc.driver.oracledriver"); system.out.println( "ドライバーの読み込みに正常に"); // 2。 conn = drivermanager.getConnection( "jdbc:oracle:thin:@172.16.3.8:1521:orcl"、 "jsd1601"、 "jsd1601"); system.out.println(conn.getClass()。getName()); // 3。 // statmentステートメントオブジェクト。 SQL Statement/ * * int exhautUpdate(String SQL)を送信および実行します。 *挿入、更新、削除ステートメントの送信string sql = "emp_jiawenzheに挿入(empno、ename、sal、deptno)" + "values(1000、 'wang xiaoer'、1500,10)"; int i = stmt.executeupdate(sql); if(i> 0){system.out.println( "正常に保存!"); }} catch(classNotFoundException e){e.printstacktrace(); // 1。ログを記録// 2。発信者に新しいruntimeException( "Load Driver Error"、e)をスローするように通知します。 }最後に{//接続を閉じます(conn!= null){try {conn.close(); } catch(sqlexception e){e.printstacktrace(); }}}}}}}注:Oracleデータベースで使用できるJARパッケージojdbc14.jar/ojdbc6.jar(oracle12cがこれを使用します)
MySQLデータベースで使用できるJARパッケージ:mysql-connector-java-5.4-bin.jar
ドライバークラスの読み込み:
class.forname( "com.mysql.jdbc.driver");
1。パッケージング方法の導入
最も触れたのは、特定の一連のコードを書いているとき、コードの再利用がある場合、メソッドのカプセル化からクラスのカプセルのカプセルまで、コードをある程度カプセル化する方法を間違いなく選択することです。データベース操作のためのJDBCの使用(追加、削除、および修正)は、クエリには結果セットの操作が含まれ、個別に宣言されているため)。
1)ドライバーのロード
2)接続を作成します
3)ステートメントオブジェクトを作成し、SQLを送信します
4)接続を閉じます
つまり、データベース操作を実行するときは、上記の手順を実行する必要があります。これにより、コードの冗長性が発生します。そこで、これらの一般的な手順をクラスにカプセル化することを提案して、それが私の使用のためのツールクラスになることができるようにしました。
2。カプセル化の3つのバージョン
バージョン1
私が学んでいたとき、私はこれらのクラスを徐々に徐々にカプセル化し、徐々に改善しました。カプセル化の究極のバージョンが直接提案されている場合、初心者が受け入れることは困難です。最初の、つまり、カプセル化の最も単純な方法について説明します。
データベースをどのように操作したいとしても、ドライバーのロードが不可欠であることが重要であり、ロードドライバーには主に宣言、ドライバー名、IPアドレス、ポート番号、データベースアカウント名、パスワードなどが含まれているため、これらの本質は文字列です。
private static string driverclass = "oracle.jdbc.driver.oracledriver"; private static string url = "jdbc:oracle:thin:losthost:1521:orcl"; private static string user = "system"; private static string password = "123";
このようにして、接続を作成するときに、変数の名前を直接取得して長い文字列を置き換えることができます。ドライバーをロードすると、メソッドclass.fornameは静的ブロックで宣言されます。これは、データを読み込んでいる間、ドライバーがロードされるためです。
以下に示すように:
static {try {class.forname(driverclass); } catch(classNotFoundException e){e.printstacktrace();新しいruntimeexception( "Load Driver Error"、e)を投げます。 }}接続を作成するために、DriverManagerのGetConnectionメソッドを呼び出し、対応するユーザー名とパスワードを入力します。この方法を私が定義した方法に直接配置し、直接私の方法を呼び出して接続を作成します。メソッドの返品値は接続オブジェクトであり、以下に示すように、この接続タイプオブジェクトを取得したいため、理解しやすいことに注意してください。
public static Connection getConnection()throws sqlexception {connection conn = drivermanager.getConnection(url、user、password); conn; }次に、ステートメントオブジェクトを作成し、SQLを送信します。もちろん、SQLはここで唯一の特別な場所です。SQLが行う必要があることは非常に異なるため、このステップをカプセル化する必要はありません。
最後に、以下に示すように、接続を閉じます。
public static void close(connection conn){if(conn!= null){try {conn.close(); } catch(sqlexception e){e.printstacktrace();新しいruntimeexception( "Close Connection Error"、e)を投げます。 }}}}パッケージの全体的な最初のバージョンは次のとおりです。
パッケージjbbc_day01; import java.sql.connection; import java.sql.drivermanager; import java.sql.sqlecception;/** *接続の管理 * @author jiawenzhe * */public class dbutil {private static driverclass = "oracle.jdbc.driver"; private static string url = "jdbc:oracle:thin:losthost:1521:orcl"; private static string user = "system"; private static string password = "123"; // 1。ドライバーのロードstatic {try {class.forname(driverclass); } catch(classNotFoundException e){e.printstacktrace();新しいruntimeexception( "Loading Driver Error"、e)を投げます。 }}} // 2。接続の作成/**接続を作成できるメソッドを定義する方法* return値タイプ:操作結果があるかどうか、結果のタイプがある場合、結果のタイプはパラメーターリストになります。 conn; } // 3。接続を閉じるpublic static void close(connection conn){if(conn!= null){try {conn.close(); } catch(sqlexception e){e.printstacktrace();新しいruntimeexception( "Close Connection Error"、e)を投げます。 }}}}}この方法でカプセル化するだけで、SQL操作を実行するときにカプセル化クラスを直接呼び出します。書く必要があるのは、ステートメントオブジェクトを作成してSQLステートメントを送信することだけです
バージョン2
実際、バージョン2はバージョン1に非常に似ています。バージョン1の欠点の1つを補うため、つまりデータベースを変更すると、異なるデータベースのアカウントパスワードが異なるため、アカウントのパスワードとIPアドレスを変更する必要があります。私は以前、これらをツールクラスで文字列の形でカプセル化しました。つまり、データベースを変更するたびにツールクラスを変更する必要がありますが、これは非常に不適切です。そこで、これらの接続データを構成ファイルに配置する改善方法を提案し、ツールクラスはこの構成ファイルを読み取ります。構成ファイルを変更するときに、構成ファイルを直接変更できます。
このバージョンを導入する前に、新しいクラス「プロパティ」を導入しました。これは、ストリームの形式で構成ファイルコンテンツを読み取り、読み取り、ツールクラスに戻すことができるファイルです。
まず、構成ファイルの例を示します。実際、説明する必要はありません。以下に示すように、それは一目で明らかです:
jdbc.driverclass = oracle.jdbc.driver.oracledriverjdbc.url = jdbc:oracle:thin:localhost:orcljdbc.user = systemjdbc.password = 123
前面が鍵であり、以下は値であり、以前のキー値は自分自身によって定義されます。変数名を定義するのと同じように、後続の値はデータベースの実際の状況です。ここで特に注意する必要があるのは、この構成ファイルの接尾辞名が.propertiesで終了する必要があることです。このようにして、プロパティクラスを読むことができるためです。
このセクションの例は次のとおりです。
static {try {//プロパティファイルデータプロパティをロードop = new Properties(); pop.load(dbutil2.class.getClassLoader()。getResourceasStream( "db.properties")); url = pop.getProperty( "jdbc.url"); DriverClass = pop.getProperty( "JDBC.DriverClass"); user = pop.getProperty( "jdbc.user");パスワード= pop.getProperty( "jdbc.password"); class.forname(driverclass); } catch(classNotFoundException e){e.printstacktrace();新しいruntimeexception( "Load Driver Error"、e)を投げます。 } catch(ioException e){// todo auto-fenated catch block e.printstacktrace(); }}Load()の方法は、それを読み取ることです。または、構成ファイルを読み込んでいると見なすことができます。その意味を掘り下げることなく、この文章全体を覚えておいてください。 getProperty()キーを介して対応する値を取得します。これは、キー値ペアセットの値を取得するという形式に非常に似ています。
全体のコードは次のとおりです。
パッケージjbbc_day01; import java.io.fileinputStream; Import java.io.io.ioexception; Import java.io.inputStream; Import java.sql.connection; Import java.sql.drivermanager; Import Java.sql.sqlecception; Immate情報、プロパティに保存されたファイル * @author jiawenzhe * */public class dbutil2 {private static string driverclass;プライベート静的文字列URL;プライベート静的文字列ユーザー。プライベート静的文字列パスワード。 // 1。 load driver static {try {//プロパティファイルデータプロパティをロードop = new Properties(); pop.load(dbutil2.class.getClassLoader()。getResourceasStream( "db.properties")); url = pop.getProperty( "jdbc.url"); DriverClass = pop.getProperty( "JDBC.DriverClass"); user = pop.getProperty( "jdbc.user");パスワード= pop.getProperty( "jdbc.password"); class.forname(driverclass); } catch(classNotFoundException e){e.printstacktrace();新しいruntimeexception( "Load Driver Error"、e)を投げます。 } catch(ioException e){// todo auto-fenated catch block e.printstacktrace(); }} // 2。接続の作成/**接続を作成できるメソッドを定義する方法* return値タイプ:操作結果があるかどうか、結果のタイプがある場合、結果のタイプはパラメーターリストになります。 conn; } // 3。接続を閉じるpublic static void close(connection conn){if(conn!= null){try {conn.close(); } catch(sqlexception e){e.printstacktrace();新しいruntimeexception( "Close Connection Error"、e)を投げます。 }}}}}