본문 바로가기
Dev/Java

JDBC 프로그래밍을 해보자 (2)

by yeonise 2022. 7. 27.

이전 글에서 JDBC 드라이버를 로드하고 MySQL 데이터베이스와 연결했다. 이어서 SQL문을 실행하여 데이터를 가져오고 추가해보자.


3. Statement 인터페이스를 사용하여 SQL 문을 실행하기

 

MySQL 데이터베이스와 연결했다면 SQL 문을 DBMS에 전송할 수 있는 Statement 객체를 생성한다. Statement 객체는 다음과 같이 Connection 인터페이스의 createStatement() 메서드로 생성할 수 있다.

 

Statement stmt =  con.createStatement(); // con은 Connection 타입의 참조변수를 의미

 

Statement 객체를 생성하지 못했다면 SQLException이 발생하기 때문에 예외 처리를 해야 한다.

 

Statement 객체를 생성하면 세 가지 방법으로 SQL 문을 DBMS에 전송할 수 있다. 보통 SELECT 문장을 전송할 때는 executeQuery() 메서드를 사용하고, INSERT, UPDATE, DELETE 같이 그 외에는 executeUpdate() 메서드를 사용한다. SELECT 문장인지 알 수 없을 때는 execute() 메서드를 사용한다.

 

Statement 인터페이스가 제공하는 주요 메서드

메서드 설명
boolean execute(String sql) SQL 문을 수행한다. 실행 결과가 ResultSet 객체라면 true, 아니면 false를 반환한다.
ResultSet executeQuery(String sql) SQL 문을 수행한다. ResultSet 객체를 반환한다.
int executeUpdate(String sql) SQL 문을 수행한다. 영향을 받은 레코드의 개수를 반환한다.

 

ResultSet은 SQL 질의문의 결과물을 추상화한 인터페이스이다. ResultSet 객체가 테이블 형식의 모든 결과물을 한꺼번에 가져오지는 않는다. ResultSet 객체는 결과 집합에서 현재 레코드를 지시하는 커서를 사용하며, 커서의 초깃값은 첫 번째 레코드 이전을 가리킨다. next()와 previous()를 호출하여 원하는 레코드의 위치로 이동할 수 있다.

 

public static void main(String[] args) {
    Connection con = makeConnection();
    
    // JDBC에서 쿼리를 작성할 때는 세미콜론을 빼고 작성한다.
    String sql = "SELECT NAME, PHONE FROM PERSON ";
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
    // SQL 문을 실행한 후 결과집합인 ResultSet 객체를 가져온다.
     
    while (rs.next()) { // 결과집합을 사용해 필요한 내용을 출력한다.
    	System.out.print("name : " + rs.getString(1) + " ");
        // rs.getString("name")을 사용해도 결과가 동일하다. 
        System.out.println("phone : " + rs.getString("phone"));
        // rs.getString(2)을 사용해도 결과가 동일하다.
    } // 레코드의 컬럼은 배열과 달리 0부터 시작하지 않고 1부터 시작한다는 점을 주의하자.
}

 

ResultSet 인터페이스가 제공하는 주요 메서드

메서드 설명
void close() ResultSet 객체를 닫는다.
int getInt(int columnIndex) 현재 레코드에서 주어진 열의 값을 int 타입으로 반환한다.
String getString(int columnIndex) 현재 레코드에서 주어진 열의 값을 String 타입으로 반환한다.
boolean next() 커서를 다음 행으로 이동한다.
boolean previous() 커서를 이전 행으로 이동한다.

 

 

 

4. PreparedStatement 인터페이스를 사용하여 SQL 문을 실행하기

 

Statement 인터페이스 대신에 Statement의 자식인 PreparedStatement 인터페이스를 사용할 수 있다.

 

PreparedStatement를 사용하면 SQL 문을 미리 만들어 두고 사용할 수 있기 때문에 효율성이나 유지 보수 면에서 유리하다. 그래서 보통 SELECT 할 때는 Statement 객체를 사용하고, INSERT와 같이 동적으로 값을 할당하는 경우에는 PreparedStatement 객체를 사용한다.

 

prepareStatement() 메서드에서 인수인 SQL 문에 변수를 나타내는 물음표를 사용할 수 있다. 물음표는 setInt(), setString() 메서드 값으로 설정한다. 

 

PreparedStatement pstmt = con.prepareStatement("UPDATE EMP SET SALARY = ? WHERE ID = ?");

pstmt.setBigDecimal(1, 153833.00) // 첫 번째 물음표

pstmt.setInt(2, 110592) // 두 번째 물음표

pstmt.executeUpdate(); // SQL 문 수행

 

다음은 PreparedStatement를 사용해 contacts의 person 테이블에 하나의 레코드를 추가하는 예제이다. INSERT는 SELECT와 달리 반환되는 데이터들이 없으므로 ResultSet 객체가 필요없다.

 

import java.sql.*;

public class DBDemo {
    public static void main(String[] args) throws SQLException {
    	Connection con = makeConnection();
        String sql = "INSERT INTO PERSON (NAME, PHONE, EMAIL) "
               sql += "VALUES (?, ?, ?) ";
        PreparedStatement pstmt = con.prepareStatement(sql);
        
        pstmt.setString(1, "유재석"); // 첫 번째 물음표
        pstmt.setString(2, "010-1234-5678"); // 두 번째 물음표
        pstmt.setString(3, "yjs@google.com"); // 세 번째 물음표
        pstmt.executeUpate(); // SQL 문 수행

 

지금까지 기본적인 JDBC 프로그래밍의 과정을 살펴봤다. 객체들을 사용하고 항상 close() 해주는 것을 잊지 말자.

 

 

 

reference 쉽게 배우는 자바 프로그래밍

 

 

 

관련된 이전 글

 

JDBC 프로그래밍을 해보자 (1)

JDBC API를 이용해 데이터를 추가, 검색, 수정, 삭제할 수 있는 자바 애플리케이션을 작성하는 것을 JDBC 프로그래밍이라고 한다. 관련된 API는 대부분 java.sql 패키지에 포함되어 있다. 이를 이용하여

jamstorage.tistory.com

 

댓글