[JDBC] Statements, PreparedStatement and CallableStatement

JDBC 연결 후 데이터베이스와 상호 작용하기

JDBC 연결을 얻으면 데이터베이스와 상호 작용할 수 있습니다. Statement, PreparedStatement, CallableStatement 인터페이스는 SQL 또는 PL/SQL 명령을 보내고 데이터베이스로부터 데이터를 받을 수 있는 메서드와 속성을 정의합니다. 이 인터페이스들은 자바와 데이터베이스에서 사용되는 SQL 데이터 타입 간의 데이터 타입 차이를 연결하는 메서드도 정의합니다. 

인터페이스 추천 사용
Statement 데이터베이스에 대한 범용 액세스를 위해 사용합니다. 런타임에 정적 SQL 문을 사용할 때 유용합니다.
Statement 인터페이스는 매개변수를 받을 수 없습니다.
PreparedStatement SQL 문을 여러 번 사용할 계획일 때 사용합니다. 런타임에 입력 매개변수를 받을 수 있습니다.
CallableStatement 데이터베이스 저장 프로시저에 접근할 때 사용합니다. 런타임에 입력 매개변수를 받을 수 있습니다.

Statement 객체

Statement 객체 생성

SQL 문을 실행하기 위해서 Statement 객체를 사용하기 전에 Connection 객체의 createStatement() 메서드를 사용하여 하나를 생성해야 합니다.

Statement stmt = null;
try {
 stmt = conn.crateStatement();
} catch (SQLException e) {
} finally {
}

Statement 객체를 생성한 후에는 세 가지 execute 메서드 중 하나를 사용하여 SQL 문을 실행할 수 있습니다.

  • boolean execute(String SQL) : ResultSet 객체를 검색할 수 있으며 true를 반환하고 그렇지 않으면 false를 반환합니다. 이 메서드는 SQL DDL 문을 실행하거나 동적 SQL을 사용할 때 유용합니다.
  • int executeUpdate(String SQL) : SQL 문 실행으로 영향을 받은 행의 수를 반환합니다. 이 메서드는 insert, update, delete 문과 같이 영향을 받은 행의 수를 기대하는 SQL 문을 실행할 때 사용합니다.
  • ResultSet executeQuery(String SQL) : ResultSet 객체를 반환합니다. select 문과 같이 결과 집합을 기대할 때 이 메서드를 사용합니다.

Statement 객체 닫기

데이터베이스 리소스를 절약하기 위해 Connection 객체를 닫는 것처럼 Statement 객체도 닫아야 합니다.

간단히 close() 메서드를 호출하면 됩니다. Connection 객체를 먼저 닫으면 Statement 객체도 닫히지만 올바르게 닫을려면 Statement 객체를 명시적으로 닫아야 합니다.

Statement stmt = null;
try {
 stmt = conn.crateStatement();
} catch (SQLException e) {
} finally {
 stmt.close();
}

PreparedStatement 객체

PreparedStatement 인터페이스는 Statement 인터페이스를 확장하여 추가 기능을 제공하며 Statement 객체에 비해 인수를 동적으로 제공할 수 있는 이점이 있습니다.

PreparedStatement 객체 생성

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   // ...
} catch (SQLException e) {
   // ...
} finally {
   // ...
}

JDBC에서 모든 매개변수는 ? 기호로 표시되며, 이는 매개변수 마커라고 합니다. SQL 문을 실행하기 전에 모든 매개변수에 값을 제공해야 합니다.

setXX() 메서드는 값들을 매개변수에 바인딩합니다. 여기서 XX는 입력 매개변수에 바인딩할려는 값의 JAVA 데이터 타입을 나타냅니다. 값을 제공하지 않으면 SQLException을 받게 됩니다.

각 매개변수 마커는 순서 위치로 참조됩니다. 첫 번째 마커는 위치 1을 나타내고, 다음은 위치 2를 나타내며 배열 인덱스와는 다릅니다. 

데이터베이스와 상호작용하는 Statement 객체의 모든 메서드는 PreparedStatement 객체에서도 작동합니다.

Statement 객체를 닫는 것처럼 PreparedStatement 객체도 닫아야합니다.

try (Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD)) {
    final String QUERY3 = "select * from Users where id= ?";
    PreparedStatement pstmt = conn.prepareStatement(QUERY3);
    pstmt.setInt(1, 1);
    ResultSet rs = pstmt.executeQuery();
    while(rs.next()) {
        System.out.println(rs.getInt("id"));
        System.out.println(rs.getString("first_name"));
        System.out.println(rs.getString("last_name"));
    }
} catch(SQLException e) {
    e.printStackTrace();
} finally {
	pstmt.close();
}

CallableStatement 객체

Connection 객체가 CallableStatement 객체도 생성하여 데이터베이스 저장 프로시저를 호출하는 데 사용할 수 있습니다.

프로시저에는 3가지 유형의 매개변수가 있습니다.

  • IN: SQL 문이 생성될 때 값이 알려지지 않은 매개변수입니다. setXXX() 메서드를 사용하여 IN 매개변수에 값을 바인딩합니다.
  • OUT: SQL 문이 반환하는 값을 제공하는 매개변수입니다. getXXX() 메서드를 사용하여 OUT 매개변수에서 값을 검색합니다.
  • INOUT: 입력 값과 출력 값을 모두 제공하는 매개변수입니다.

모든 매개변수에 값을 바인딩해야 하며, 그렇지 않으면 SqlExeption을 받게됩니다.

IN 매개변수가 있는 경우 setXXX() 메서드를 사용합니다.

OUT 매개변수가 있는 경우 registerOutParameter()를 사용해야 합니다. 해당 메서드는 JDBC 데이터 타입을 저장 프로시저가 반환할 것으로 예상되는 타입에 바인딩합니다.

'Databases > JDBC' 카테고리의 다른 글

[JDBC] Data Types  (0) 2024.07.05
[JDBC] ResultSet란  (0) 2024.07.05
[JDBC] 데이터베이스 연결 설정  (1) 2024.07.05
[JDBC] Driver Types  (0) 2024.07.05
[JDBC] JAVA에서 데이터베이스 연결해보기  (0) 2024.07.05