jdbc exception handling how handle sql exceptions
css3 인터뷰 질문 및 답변 pdf
이 JDBC 예외 처리 자습서에서는 프로그래밍 예제를 사용하여 SQL 예외를 처리하는 방법을 설명합니다.
에서 JDBC 트랜잭션 관리 튜토리얼 JDBC 튜토리얼 시리즈 , 우리는 JDBC 트랜잭션 유형, 데이터 유형, 트랜잭션 관리 방법 및 Java 프로그램에서 사용하는 방법을 배웠습니다.
이 튜토리얼에서는 JDBC의 예외와 처리 방법에 대해 알아 봅니다. JDBC에서 데이터베이스 연결 또는 DB 관련 문제로 인해 예외가 발생하면 SQLException이 발생합니다. 여기에서 SQLExceptions에 대한 자세한 정보를 볼 수 있습니다.
JDBC의 예외에 대해 배울 준비를합시다.
학습 내용 :
JDBC 예외 처리
프로그램 실행에 오류 또는 경고가있는 경우 예외가 발생합니다. 예외가 발생하면 프로그램의 정상적인 흐름이 방해 받고 프로그램이 비정상적으로 종료됩니다. 예외의 좋은 점은 try-catch 블록을 사용하거나 키워드를 throw하여 예외를 처리 할 수 있다는 것입니다. 모든 예외와 오류는 Throwable 클래스의 하위 클래스입니다. Throwable 클래스는 모든 예외 및 오류의 기본 클래스입니다.
Java 예외 처리 키워드
Java 예외 처리에는 5 개의 키워드가 있습니다. 다음과 같습니다.
- 시험: 예외를 발생시킬 수있는 프로그램 문은 try 블록 내에 보관해야합니다.
- 잡기: try 블록에서 예외가 발생하면 throw됩니다. Catch 블록을 사용하여 예외를 포착하고 코드에서 처리 할 수 있습니다.
- 던지다: 시스템 생성 예외는 JVM에 의해 자동으로 발생합니다. 예외를 수동으로 throw하려면 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도 반환 할 수 있습니다. 데이터베이스 오류의 경우 XOPEN SQL State를 반환합니다. |
getNextException () | 예외 체인에서 다음 예외를 반환합니다. |
printStackTrace () | 현재 예외와 역 추적을 표준 오류 스트림에 인쇄합니다. |
setNextException (SQLEXception 예) | 체인에 다른 SQL 예외를 추가하는 데 사용됩니다. |
예외 처리 방법
JDBC 관련 예외는 대부분 SQLException을 throw하며 확인 된 예외이므로 catch하거나 throw해야합니다. 모든 비즈니스 로직과 커밋 데이터는 Try 블록에서 수행되어야합니다. 블록에서 예외가 발생하면 Catch 블록에서이를 포착하고 처리해야합니다. 예외 유형에 따라 Catch 블록에서 롤백 또는 커밋을 수행해야합니다.
SQLException의 범주
때때로 JDBC 드라이버는 특정 SQL 상태 클래스 값과 특별히 연관되지 않은 공통 SQL 상태 또는 공통 오류 상태를 나타내는 SQLException의 서브 클래스를 처리 할 수 있습니다. 더 구체적인 방법으로 예외를 처리 할 수 있으며 코드에서 처리 할 수 있습니다. 이러한 유형의 예외는 다음 예외 중 하나의 하위 클래스에 속합니다.
- SQLNonTransientException : 이 유형의 예외는 SQLException의 원인이 수정되지 않는 한 동일한 작업의 재 시도가 실패하는 인스턴스가 발생하면 throw됩니다.
- SQLTransientException : 이 유형의 예외는 변경 / 중재없이 작업을 다시 시도 할 때 이전에 실패한 작업이 성공할 수있을 때 throw됩니다.
- SQLRecoverableException : 이 유형의 예외는 이전에 실패한 작업이 응용 프로그램의 변경 / 중재로 작업을 다시 시도 할 때 성공할 수있을 때 throw됩니다. 이 작업을 수행하는 동안 현재 연결이 닫히고 새 연결이 열려야합니다.
SQLException의 다른 서브 클래스 :
다음은 SQLException의 서브 클래스입니다.
- BatchUpdateException : 이 유형의 예외는 일괄 업데이트 작업을 수행하는 동안 오류가 발생하면 throw됩니다. SQLException 정보 외에도 BatchUpdateException은 오류가 발생하기 전에 실행 / 업데이트 된 명령문의 상태를 제공합니다.
- SQLClientInfoException : 이 유형의 예외는 연결에 하나 이상의 정보 속성을 설정할 수없는 경우 발생합니다. SQLException 정보 외에 SQLClientInfoException은 설정되지 않은 클라이언트 정보 속성 목록입니다.
이 자습서에서는 일반적인 SQLException을 확인한 다음 BatchUpdateException을 확인합니다. 시스템에서 SQLException의 나머지 서브 클래스를 실행할 수 있습니다.
다음 예에서는 예외를 처리하는 방법에 대해 자세히 설명합니다.
이 튜토리얼에서는 모든 프로그램이 Java로 작성됩니다. 우리는 Java 8 버전과 Oracle DB를 사용했습니다.
>> 클릭 여기 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 테이블에없는 열 이름을 가진 하나의 선택 쿼리를 작성했습니다.
쿼리 만들기 :
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
#두) 연결, 문을 생성하고 try 블록에서 select QUERY를 실행했습니다.
#삼) Catch 블록에서 예외를 처리했습니다.
# 4) getError () 메서드를 사용하여 예외의 Error, getSQLState () 메서드를 사용하여 예외의 SQLState, getMessage () 메서드를 사용하여 예외 메시지를 표시하고 printStackTrace 메서드를 사용하여 예외의 스택 추적을 인쇄합니다.
BatchUpdateException 예
BatchUpdateException 예제를 설명하기 위해 하나의 새 테이블을 만들었습니다. 테이블 이름은 EMPLOYEE입니다. 3 개의 열이 있습니다.
그들은:
- 기본 키인 ID
- 성
- 이름
ORACLE DB에서 테이블을 생성하는 구문 :
CREATE TABLE EMPLOYEE ( ID int NOT NULL PRIMARY KEY, LastName varchar(255), FirstName varchar(255) );
자바 프로그램 :
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이 있습니다.성ID 열이 EMPLOYEE 테이블의 기본 키이기 때문에 프로그램에서 BatchUpdateException이 발생했습니다.
- EMPLOYEE 테이블에 삽입하기 위해 3 개의 삽입 쿼리를 작성했습니다. 첫 번째와 세 번째 쿼리의 ID 값이 동일합니다. id 열은 EMPLOYEE 테이블에 대한 기본 키입니다.
- 문 객체를 만들고 addBatch () 메서드를 사용하여이 3 개의 쿼리를 추가했습니다. 그런 다음 executeBatch () 메서드를 호출하여 실행합니다.
- 첫 번째와 세 번째 쿼리는 동일한 ID 값을 갖기 때문에. executeBatch ()가 세 번째 쿼리를 실행하려고하면 BatchUpdateException이 발생합니다.
- BatchUpdateException catch 블록에서 업데이트 된 행의 상태를 가져 오기 위해 getUpdateCounts () 메서드를 호출했습니다.
- for 루프를 사용하여 특정 명령문의 실행 상태가 실패했는지 여부를 하나씩 확인합니다. 특정 명령문이 실패하지 않으면 명령문의 행 번호를 인쇄합니다.
- 그 후 BatchUpdateException의 printStackTrace를 인쇄합니다.
- 위의 예에서는 세 번째 문으로 인해 예외가 발생했기 때문에 문 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의 예외 체인은 무엇이며 그 용도는 무엇입니까?
대답: 다른 예외를 발생시키는 한 가지 예외를 예외 체인 또는 체인 예외라고합니다. 대부분의 경우 하나의 예외를 다른 예외와 연결하도록 예외를 연결해야 로그를 명확하고 쉽게 추적 할 수 있습니다. 디버깅 과정에서 프로그래머에게 도움이 될 것입니다.
예를 들면 :
0으로 나누기 때문에 산술 예외를 발생시키는 메소드를 고려하십시오. 예외의 실제 원인은 제수가 0이되는 I / O 오류입니다. 이 메서드는 프로그래머에게 산술 예외 만 throw합니다. 호출자 / 프로그래머가 Exception의 실제 원인을 알지 못하도록합니다. 이런 상황에서 우리는 체인 예외를 사용할 수 있습니다.
결론
예외는 try-catch 블록을 사용하거나 throw하여 처리 할 수 있습니다. 데이터베이스로 인해 발생한 예외를 SQLException이라고합니다. Exception의 하위 클래스 인 SQLException에 대한 별도의 클래스가 있습니다. 보다 구체적으로 SQL 예외에 대해 알 수있는 방법이 있습니다.
메소드는 getMessage (), getErrorCode (), getSQLState (), getNextException 및 printStackTace입니다. getNextException은 예외 체인의 경우에 사용됩니다.