jdbc exception handling how handle sql exceptions
Android用の最高のVRアプリは何ですか
このJDBC例外処理チュートリアルでは、プログラミング例を使用してSQL例外を処理する方法について説明します。
の中に JDBCトランザクション管理 のチュートリアル JDBCチュートリアルシリーズ 、JDBCトランザクションタイプ、データタイプ、トランザクション管理方法、およびJavaプログラムでそれらを使用する方法を学びました。
このチュートリアルでは、JDBCの例外とその処理方法について学習します。 JDBCでは、データベース接続またはDBに関連する何かが原因で例外が発生した場合、SQLExceptionの対象になります。ここでは、SQLExceptionsについて詳しく説明します。
JDBCの例外について学ぶ準備をしましょう。
学習内容:
JDBC例外処理
プログラムの実行中にエラーまたは警告が発生すると、例外が発生します。例外が発生すると、プログラムの通常の流れが乱れ、プログラムが異常終了します。例外の良いところは、try-catchブロックまたはthrowsキーワードを使用して処理できることです。すべての例外とエラーは、クラスThrowableのサブクラスです。 Throwableクラスは、すべての例外とエラーの基本クラスです。
Java例外処理キーワード
Java例外処理には5つのキーワードがあります。それらは次のとおりです。
- 試してみてください: 例外を発生させる可能性のあるプログラムステートメントは、tryブロック内に保持する必要があります。
- キャッチ: tryブロックで例外が発生すると、例外がスローされます。 Catchブロックを使用してその例外をキャッチし、コードで処理できます。
- スロー: システムで生成された例外は、JVMによって自動的にスローされます。手動で例外をスローするには、キーワードthrowを使用する必要があります。
- スロー: メソッドからスローされた例外はすべて、throws句で指定する必要があります。
- 最後に: tryブロックの後に実行する必要のあるプログラムステートメントは、finallyブロックに保持する必要があります。
>>クリック ここに Javaの例外の詳細については。
SQLException
JDBCでは、クエリを実行または作成するときに例外が発生する場合があります。データベースまたはドライバーが原因で発生する例外は、SQL例外に分類されます。例外処理を使用すると、通常の例外を処理するのと同じようにSQL例外を処理できます。
SQLExceptionは、java.sqlパッケージで利用できます。これは、Exceptionクラスを拡張します。これは、SQLExceptionクラスのExceptionクラスで使用可能なメソッドも使用できることを意味します。
SQL例外の例
SQLステートメントの構文エラーにより、SQL例外が発生する場合があります。このような例外が発生すると、SQLExceptionクラスのオブジェクトがcatchブロックに渡されます。 SQLExceptionオブジェクトの情報を使用することで、その例外をキャッチしてプログラムを続行できます。
SQLExceptionオブジェクトには、次のメソッドがあります。
メソッド名 | 説明 |
---|---|
getErrorCode() | エラー番号を返します |
getMessage() | エラーメッセージを返します |
getSQLState() | SQLExceptionオブジェクトのSQLStateを返します。 nullを返すこともできます。データベースエラーの場合、XOPENSQL状態を返します |
getNextException() | 例外チェーンの次の例外を返します。 |
printStackTrace() | 現在の例外とそのバックトレースを標準エラーストリームに出力します |
setNextException(SQLEXception ex) | チェーンに別のSQL例外を追加するために使用されます |
例外を処理する方法
JDBC関連の例外は主にSQLExceptionをスローします。これはチェックされた例外であるため、キャッチするかスローする必要があります。すべてのビジネスロジックとコミットデータはTryブロックで実行する必要があります。ブロックで例外が発生した場合は、Catchブロックでキャッチして処理する必要があります。例外タイプに基づいて、Catchブロックでロールバックまたはコミットを実行する必要があります。
SQLExceptionのカテゴリ
JDBCドライバーは、特定のSQL状態クラス値に特に関連付けられていない一般的なSQL状態または一般的なエラー状態を表すSQLExceptionのサブクラスをスローする場合があります。これにより、より具体的な方法で例外を処理できるようになり、コードで処理できるようになります。 これらのタイプの例外は、次のいずれかの例外のサブクラスに分類されます。
- SQLNonTransientException: このタイプの例外は、SQLExceptionの原因が修正されていない限り、同じ操作の再試行が失敗するインスタンスの場合にスローされます。
- SQLTransientException: このタイプの例外は、変更や介入なしに操作を再試行したときに、以前に失敗した操作が成功した場合にスローされます。
- SQLRecoverableException: このタイプの例外は、アプリケーションによる変更/介入を使用して操作を再試行したときに、以前に失敗した操作が成功する可能性がある場合にスローされます。その間、現在の接続を閉じて、新しい接続を開く必要があります。
SQLExceptionの他のサブクラス:
以下は、SQLExceptionのサブクラスです。
- BatchUpdateException: このタイプの例外は、バッチ更新操作の実行中にエラーが発生した場合にスローされます。 SQLException情報に加えて、BatchUpdateExceptionは、エラーが発生する前に実行/更新されたステートメントのステータスを提供します。
- SQLClientInfoException: このタイプの例外は、1つ以上の情報プロパティを接続に設定できなかった場合にスローされます。 SQLException情報に加えて、SQLClientInfoExceptionは、設定されていないクライアント情報プロパティのリストです。
このチュートリアルでは、通常のSQLExceptionが表示され、次にBatchUpdateExceptionが表示されます。システムでSQLExceptionの残りのサブクラスを実行できます。
次の例では、例外の処理方法について詳しく説明します。
このチュートリアルでは、すべてのプログラムがJavaで記述されています。 Java8バージョンとOracleDBを使用しました。
>>クリック ここに Oracleソフトウェアをダウンロードするには
>>クリック ここに Javaバージョン8をダウンロードするには
ステップバイステップのJavaインストールプロセスがあります。
例外サンプルプログラム
package com.STH.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Exception_Example { public static void main(String() args) throws ClassNotFoundException { // TODO Auto-generated method stub String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011'; //Update query to set the email id for the employee whose empNUM is 10011 Class.forName('oracle.jdbc.driver.OracleDriver'); try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { Statement statemnt1 = conn.createStatement(); ResultSet rs1 =null; statemnt1 = conn.createStatement(); System.out.println('Executing Update query using executeUpdate method'); int return_rows = statemnt1.executeUpdate(update_query); System.out.println('No. of Affected Rows = '+ return_rows); } catch(SQLException sqe) { System.out.println('Error Code = ' + sqe.getErrorCode()); System.out.println('SQL state = ' + sqe.getSQLState()); System.out.println('Message = ' + sqe.getMessage()); System.out.println('printTrace /n'); sqe.printStackTrace(); } } }
出力:
説明:
#1) EMPLOYEE_DETAILSテーブルにない列名を持つ1つの選択クエリを作成しました。
クエリの作成:
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
#二) 接続、ステートメントを作成し、tryブロックでselectQUERYを実行しました。
#3) Catchブロックでは、例外を処理しました。
#4) getError()メソッドを使用して例外のエラー、getSQLState()メソッドを使用して例外のSQLState、getMessage()メソッドを使用して例外のメッセージを表示し、printStackTraceメソッドを使用して例外のスタックトレースを出力しています。
BatchUpdateExceptionの例
BatchUpdateExceptionの例を説明するために、1つの新しいテーブルを作成しました。テーブルの名前はEMPLOYEEです。 3つの列があります。
彼らです:
- 主キーであるID
- 苗字
- ファーストネーム
ORACLE DBにテーブルを作成するための構文:
CREATE TABLE EMPLOYEE ( ID int NOT NULL PRIMARY KEY, LastName varchar(255), FirstName varchar(255) );
Javaプログラム:
package com.STH.JDBC; import java.sql.BatchUpdateException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Statement_ExecuteBatch_Example { public static void main(String() args) throws ClassNotFoundException, SQLException { //Inserting the following 3 rows in EMPLOYEE_DETAILS Table String insert_query1 = 'insert into employee values(101,'Patterson','Tony')'; String insert_query2 = 'insert into employee values(102,'Potter','Harry')'; String insert_query3 = 'insert into employee values(102,'Wong','Jane')'; Class.forName('oracle.jdbc.driver.OracleDriver'); //Opening Oracle DB Connection try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { Statement statemnt1 = conn.createStatement(); //Adding the 3 insert queries into the Statement object using addBatch method statemnt1.addBatch(insert_query1); statemnt1.addBatch(insert_query2); statemnt1.addBatch(insert_query3); int No_of_Afffected_Rows()= statemnt1.executeBatch(); //After inserting the data System.out.println('No of rows affected = ' +No_of_Afffected_Rows.length); } //Catching the BatchUpdateException catch(BatchUpdateException be) { //getting the updated rows status before the exception has occurred int() updateCount = be.getUpdateCounts(); int count = 1; for (int i : updateCount) { //Using for loop, printing the statement which has been successfully executed if (i == Statement.EXECUTE_FAILED) { System.out.println('Error on Statement ' + count +': Execution failed'); } else { System.out.println('Statement ' + count +': is executed'); } count++; //Incrementing the count to display the next updated row no. } //System.out.println('Error on statemet '+be.getUpdateCounts()); be.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } }
出力:
説明:
上記のプログラムで行ったことは、3つのINSERTクエリを作成し、それをバッチで追加して実行したことです。 3rdクエリのID値は1と同じですstID列がEMPLOYEEテーブルの主キーであるため、プログラムはBatchUpdateExceptionをスローしました。
- EMPLOYEEテーブルに挿入するための3つの挿入クエリを作成しました。 1番目と3番目のクエリのID値は同じです。 id列は、EMPLOYEEテーブルの主キーです。
- ステートメントオブジェクトを作成し、addBatch()メソッドを使用してこれらの3つのクエリをオブジェクトに追加しました。次に、executeBatch()メソッドを呼び出して実行します。
- 最初と3番目のクエリは同じID値を持っているため。 executeBatch()が3番目のクエリを実行しようとすると、BatchUpdateExceptionがスローされます。
- BatchUpdateExceptionキャッチブロックで、getUpdateCounts()メソッドを呼び出して、更新された行のステータスを取得しました。
- forループを使用して、特定のステートメントの実行ステータスが失敗したかどうかを1つずつチェックしています。特定のステートメントが失敗しなかった場合は、ステートメントの行番号が出力されます。
- その後、BatchUpdateExceptionのprintStackTraceを出力します。
- 上記の例では、3番目のステートメントが原因で例外が発生したため、ステートメント1と2が出力されています。次に、例外の完全なトレースが出力コンソールに出力されます。
覚えておくべきポイント:
- データベースが原因で発生した例外は、SQLExceptionになります。
- Javaの例外は、try:catchブロックを使用して処理できます。
- SQLExceptionはチェックされた例外であるため、try:catchブロックを使用して処理できます。
- SQLExceptionのサブクラスがいくつかあります。それらは、SQLNonTransientException、SQLTransientException、SQLRecoverableException、BatchUpdateException、およびSQLClientInfoExceptionです。
よくある質問
Q#1)SQL例外とは何ですか?
回答: データベースが原因で発生した例外は、SQL例外と呼ばれます。データベース関連の情報を提供する例外は、SQL例外とも呼ばれます。 JavaにはSQLExceptionクラスがあり、これは例外に関する情報を提供するために使用されます。 次の方法があります。
- getErrorCode()
- getMessage()
- getSQLState()
- printStackTrace()
- getNextException()
Q#2)SQLで例外を処理する方法は?
回答: tryブロックにビジネスロジックを記述します。エラーまたは例外が発生した場合は、Catchブロックでキャッチし、適切なメッセージを書き込んで例外を簡単に見つけます。
Try–Catchブロックは、例外を処理するために使用されます。
Q#3)JavaでSQLExceptionが発生する可能性があるのはいつですか?
回答: SQLExceptionは、データベースアクセスにエラーがある場合、またはデータベースに関連するその他のエラーがある場合に発生します。 SQLExceptionが発生すると、SQLExceptionタイプのオブジェクトがcatch句に渡されます。 Catchブロックで処理できます。
Q#4)Javaの例外チェーンとは何ですか?また、その使用法は何ですか?
回答: 別の例外を引き起こす1つの例外は、例外チェーンまたは連鎖例外として知られています。ほとんどの場合、ある例外を別の例外に関連付けるように例外をチェーンする必要があります。これにより、ログが明確になり、追跡が容易になります。これは、デバッグプロセスでプログラマーに役立ちます。
例えば:
ゼロ除算が原因で算術例外をスローするメソッドについて考えてみます。例外の実際の原因はI / Oエラーであり、除数がゼロになります。このメソッドは、プログラマーに算術例外をスローするだけです。呼び出し元/プログラマーが例外の実際の原因を知らないようにするためです。このタイプの状況では、連鎖例外を使用できます。
結論
例外は、try-catchブロックを使用するか、スローすることで処理できます。データベースが原因で発生した例外は、SQLExceptionと呼ばれます。 ExceptionのサブクラスであるSQLException用の別個のクラスがあります。 SQL例外についてより具体的に知るためのメソッドがあります。
メソッドは、getMessage()、getErrorCode()、getSQLState()、getNextException、およびprintStackTaceです。 getNextExceptionは、ExceptionChainedの場合に使用されます。