이전 글에서 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
'Dev > Java' 카테고리의 다른 글
| 자바 형 변환 관련 함수들 (0) | 2022.11.13 |
|---|---|
| JAR vs WAR 특징 알아보기 (0) | 2022.11.01 |
| JSP 내장 객체 (Implicit Object) 알아보기 (0) | 2022.08.03 |
| JSP 기본 구조 - 지시어, 스크립트 요소 (0) | 2022.08.02 |
| JDBC 프로그래밍을 해보자 (1) (0) | 2022.07.27 |
댓글