English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JDBC Statement, PreparedStatement과 CallableStatement

연결을 얻으면 데이터베이스와 상호작용할 수 있습니다. JDBC Statement, CallableStatement, PreparedStatement 인터페이스는 SQL이나 PL/SQL 명령어를 실행하고 데이터베이스에서 데이터를 수신합니다.

그들은 데이터베이스에서 사용하는 Java와 SQL 데이터 타입 간의 데이터 타입 차이를 해소하는 방법을 정의했습니다.

표는 각 인터페이스의 용도를 요약하여 사용할 인터페이스를 결정하는 데 사용됩니다.

인터페이스
추천 사용
Statement

데이터베이스에 대한 일반적인 접근을 위해 사용합니다. 실행 중 정적 SQL 문을 사용할 때 매우 유용합니다. Statement 인터페이스는 파라미터를 받을 수 없습니다.

PreparedStatement

SQL 문을 여러 번 사용할 계획이라면 이 옵션을 사용합니다. PreparedStatement 인터페이스는 실행 중 입력 파라미터를 받을 수 있습니다.

CallableStatement

데이터베이스 저장 프로시저에 접근하려면 이 옵션을 사용합니다. CallableStatement 인터페이스는 실행 중 입력 파라미터도 받을 수 있습니다.

Statement 객체

Statement 객체 생성

Statement 객체를 사용하여 SQL 문을 실행할 수 있기 전에, Connection 객체의 createStatement() 메서드를 사용하여 SQL 문을 생성해야 합니다. 다음 예제와 같습니다.-

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

Statement 객체가 생성되면, SQL 문을 실행하기 위해 그의 세 가지 실행 메서드 중 하나를 사용할 수 있습니다.

  • boolean execute (String SQL):ResultSet 객체를 검색할 수 있으면 true를 반환합니다. 그렇지 않으면 false를 반환합니다. 실제로 동적 SQL을 사용할 때, SQL DDL 문을 실행하는 데 이 메서드를 사용합니다.

  • 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.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}

또한 이해하기 위해 학습하도록 권장드립니다Statement 예제 튜토리얼

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 문을 실행하기 전에.

setXXX()메서드는 값을 파라미터에 바인딩하며XXXJava 데이터 타입을 사용하여 입력 파라미터에 바인딩할 값을 나타냅니다. 값이 제공되지 않으면 SQLException이 발생합니다.

각 파라미터 태그는 그 순서 위치를 참조합니다. 첫 번째 태그는 위치를 대표합니다1두 번째 위치를 대표합니다2와 같이 계속됩니다. 이 메서드는 Java 배열 인덱스 메서드와 다르며, 후자는 0에서 시작합니다.

데이터베이스와 상호작용하는 모든 Statement 객체의 메서드(a) execute()、(b) executeQuery() 및 (c) executeUpdate()는 PreparedStatement 객체와 함께 사용할 수 있습니다. 그러나 이 메서드들은 파라미터를 입력할 수 있는 SQL 문을 사용하는 방식으로 수정됩니다.

PreparedStatement 객체 닫기

Statement 객체와 마찬가지로, 동일한 이유로 PreparedStatement 객체도 닫아야 합니다.

단순한 close() 메서드 호출만으로도 됩니다. Connection 객체를 먼저 닫으면 PreparedStatement 객체도 닫힙니다. 그러나,PreparedStatement 객체를 명확하게 닫아야 올바르게 정리할 수 있도록 해야 합니다.

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

이해하기 위해, "PreparedStatement 예제 코드

CallableStatement 객체

Connection 객체가 Statement 및 PreparedStatement 객체를 생성하는 것처럼, CallableStatement 객체도 생성되며, 이 객체는 데이터베이스 스토리지 프로시저 호출에 사용됩니다.

CallableStatement 객체 생성

Oracle 스토리지 프로시저를 실행해야 하는 경우를 가정합니다.-

CREATE OR REPLACE PROCEDURE getEmpName 
   (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END;

NOTE: 위의 스토리지 프로시저는 Oracle에 작성되었습니다. 하지만 우리는 MySQL 데이터베이스를 사용하고 있으므로, EMP 데이터베이스에 생성하기 위해 다음과 같은 MySQL 스토리지 프로시저를 작성하겠습니다.-

DELIMITER $$
DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName` 
   (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END $$
DELIMITER ;

파라미터는 세 가지 유형이 있습니다: IN, OUT, INOUT. PreparedStatement 객체는 IN 파라미터만 사용합니다. CallableStatement 객체는 이 세 가지 모두를 사용할 수 있습니다.

이것은 각각의 정의입니다-

범위설명
IN

SQL 문장을 생성할 때 값이 알려지지 않은 파라미터입니다. setXXX() 메서드를 사용하여 값을 바인딩합니다.

OUT

이 값은 반환된 SQL 문장에 의해 제공된 파라미터의 값입니다. getXXX() 메서드를 사용하여 파라미터에서 값을 검색합니다.

INOUT

입력과 출력 값을 모두 제공하는 파라미터를 동시에 제공할 수 있습니다. setXXX() 메서드를 사용하여 변수를 바인딩하고 getXXX() 메서드를 사용하여 값을 검색할 수 있습니다.

아래의 코드 부분은 Connection.prepareCall() 메서드를 사용하여 이전 스토리지 프로시저를 어떻게 사용하는지 보여줍니다.-CallableStatement 객체를 인스턴스화합니다.

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt =conn.prepareCall(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

문자 변수 SQL은 파라미터 대체기호를 포함한 스토리지 프로시저를 나타냅니다.

CallableStatement 객체를 사용하는 것은 PreparedStatement 객체를 사용하는 것과 매우 유사합니다. 해당 문장을 실행하기 전에 모든 파라미터에 값을 바인딩해야 하며, 그렇지 않으면 SQLException을 받게 됩니다.

IN 파라미터가 있으면, PreparedStatement 객체에 적용되는 동일한 규칙과 기술을 따르세요; 바인딩된 Java 데이터 타입에 맞는 setXXX() 메서드를 사용하세요.

OUT 및 INOUT 파라미터를 사용할 때는 추가적인 CallableStatement 메서드 registerOutParameter()를 사용해야 합니다. registerOutParameter() 메서드는 JDBC 데이터 타입을 예상하는 스토리지 프로시저가 반환하는 데이터 타입에 바인딩합니다.

스토리지 프로시저를 호출한 후, 적절한 getXXX() 메서드를 사용하여 OUT 파라미터에서 값을 검색할 수 있습니다. 이 메서드는 검색된 SQL 타입의 값을 Java 데이터 타입으로 변환합니다.

CallableStatement 객체를 닫기

다른 Statement 객체와 마찬가지로, 같은 이유로 CallableStatement 객체도 닫아야 합니다.

간단하게 close() 메서드를 호출하면 됩니다. Connection 객체를 먼저 닫으면 CallableStatement 객체도 닫히지만, CallableStatement 객체를 명시적으로 닫아야 합니다. 올바른 정리를 위해 항상 명시적으로 닫아야 합니다.

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt =conn.prepareCall(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}

더 나은 이해를 위해, 배우는 것을 권장합니다CallableStatement 예제 코드