Processing SQL Statements with JDBC
JDBC를 사용한 SQL 문 처리
일반적으로 JDBC를 사용하여 SQL 문을 처리할 때는 다음과 같은 단계를 따릅니다:
- 연결을 설정한다.
- Statement를 생성한다.
- 쿼리를 실행한다.
- ResultSet 객체를 처리한다.
- 연결을 종료한다.
이 페이지에서는 튜토리얼 샘플에서 제공되는 CoffeesTable.viewTable
메서드를 사용하여 이러한 단계를 설명합니다. 이 메서드는 COFFEES
테이블의 내용을 출력합니다. 이 메서드는 튜토리얼 후반에서 더 자세히 설명됩니다:
public static void viewTable(Connection con) throws SQLException {
String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";
try (Statement stmt = con.createStatement()) {
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + ", " + supplierID + ", " + price +
", " + sales + ", " + total);
}
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
}
}
Connection 설정하기
먼저 사용하려는 데이터 소스에 연결을 설정해야 합니다. 데이터 소스는 DBMS, 레거시 파일 시스템 또는 JDBC 드라이버가 대응되는 기타 데이터 원본일 수 있습니다. 이 연결은 Connection
객체로 표현됩니다. 더 자세한 내용은 "Establishing a Connection"을 참조하세요.
Statement 생성하기
Statement
는 SQL 문을 나타내는 인터페이스입니다. Statement
객체를 실행하면 ResultSet
객체가 생성되며, 이는 데이터베이스 결과 집합을 나타내는 테이블입니다. Statement
객체를 생성하려면 Connection
객체가 필요합니다.
예를 들어, CoffeesTable.viewTable
은 다음 코드로 Statement
객체를 생성합니다:
stmt = con.createStatement();
Statement에는 세 가지 종류가 있습니다:
Statement
: 파라미터가 없는 단순한 SQL 문을 구현할 때 사용PreparedStatement
: (Statement
를 확장) 입력 파라미터를 포함할 수 있는 SQL 문을 미리 컴파일할 때 사용. 자세한 내용은 "Using Prepared Statements" 참조CallableStatement
: (PreparedStatement
를 확장) 입력 및 출력 파라미터를 포함할 수 있는 저장 프로시저를 실행할 때 사용. 자세한 내용은 "Stored Procedures" 참조
쿼리 실행하기
쿼리를 실행하려면 Statement
의 다음과 같은 execute
메서드를 호출하면 됩니다:
execute
: 쿼리의 첫 번째 결과가ResultSet
객체일 경우true
를 리턴. 쿼리가 하나 이상의ResultSet
객체를 리턴할 가능성이 있는 경우 사용.Statement.getResultSet
을 반복 호출하여 결과 집합을 얻음executeQuery
: 하나의ResultSet
객체를 리턴executeUpdate
: SQL 문에 의해 영향을 받은 행 수를 나타내는 정수를 리턴.INSERT
,DELETE
,UPDATE
문에 사용
예를 들어, CoffeesTable.viewTable
에서는 다음과 같이 Statement
객체를 실행합니다:
ResultSet rs = stmt.executeQuery(query);
자세한 내용은 "Retrieving and Modifying Values from Result Sets"를 참조하세요.
ResultSet 객체 처리하기
ResultSet
객체의 데이터에 접근하려면 커서를 통해 접근합니다. 이 커서는 데이터베이스 커서가 아니라, ResultSet
객체 내에서 하나의 행을 가리키는 포인터입니다. 처음에는 커서가 첫 번째 행 이전에 위치합니다. 커서를 이동시키기 위해 ResultSet
객체에서 정의된 다양한 메서드를 호출할 수 있습니다.
예를 들어, CoffeesTable.viewTable
은 ResultSet.next
메서드를 반복적으로 호출하여 커서를 한 행씩 앞으로 이동시키고, 각 행의 데이터를 출력합니다:
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + ", " + supplierID + ", " + price +
", " + sales + ", " + total);
}
자세한 내용은 "Retrieving and Modifying Values from Result Sets"를 참조하세요.
연결 종료하기
Connection
, Statement
, 또는 ResultSet
객체를 더 이상 사용하지 않게 되면 close
메서드를 호출하여 해당 리소스를 즉시 해제해야 합니다.
또는 try-with-resources 구문을 사용하면 SQLException
발생 여부와 관계없이 Connection
, Statement
, ResultSet
객체를 자동으로 닫을 수 있습니다. (JDBC는 데이터 소스와 상호작용 중 오류가 발생하면 SQLException
을 발생시킵니다. 자세한 내용은 "Handling SQL Exceptions" 참조.)
try-with-resources 구문은 try
구문과 하나 이상의 선언된 리소스로 구성됩니다. 예를 들어, CoffeesTable.viewTable
메서드는 다음과 같이 Statement
객체를 자동으로 닫습니다:
public static void viewTable(Connection con) throws SQLException {
String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";
try (Statement stmt = con.createStatement()) {
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + ", " + supplierID + ", " + price +
", " + sales + ", " + total);
}
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
}
}
다음 구문은 하나의 리소스(stmt
)를 선언한 try-with-resources 구문이며, try 블록이 종료될 때 자동으로 닫힙니다:
try (Statement stmt = con.createStatement()) {
// ...
}
자세한 내용은 Essential Classes의 "The try-with-resources Statement"를 참조하세요.