JDBC (Java Database Connectivity)
는 자바 애플리케이션이 데이터베이스에 연결해서 SQL 쿼리를 실행하고, 결과를 받아올 수 있게 해주는 자바 표준 API이다. JDBC의 특징은 다음과 같다.
때문에 Java의 JDBC는 여러가지 불편한 점이 많다.
PreparedStatement
는 JDBC에서 SQL을 실행할 때 사용하는 객체 중 하나로 주로 미리 컴파일된 SQL을 여러 번 실행하거나, 파라미터 바인딩을 안전하게 처리할 때 쓰인다.
PreparedStatement의 특징은 다음과 같다.
1. 미리 컴파일
2. 파라미터 바인딩
3. 타입 안전성
✍️ 예시 코드 작성
// 1) Connection 얻기
Connection conn = dataSource.getConnection();
// 2) SQL 준비 (파라미터 자리표시자 ? 사용)
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
// 3) PreparedStatement 생성 (미리 컴파일)
PreparedStatement ps = conn.prepareStatement(sql);
// 4) 파라미터 바인딩
ps.setString(1, "Alice"); // 첫 번째 ? 에 "Alice"
ps.setString(2, "alice@example.com"); // 두 번째 ? 에 이메일
// 5) 실행
int count = ps.executeUpdate(); // INSERT 실행, 영향 받은 행 수 반환
// 6) 자원 해제
ps.close();
conn.close();
PreparedStatement는 미리 컴파일된 SQL과 안전한 파라미터 바인딩을 제공하는 JDBC 핵심 클래스이다.
ResultSet
은 JDBC에서 SQL 쿼리를 실행한 결과를 담는 인터페이스로, JDBC 드라이버가 이 인터페이스의 구현체를 제공해서 실제 DB의 결과를 다룰 수 있게 한다. ResultSet을 활용하면, 각 행 (row)마다 데이터를 읽어올 수 있다.
ResultSet의 특징은 다음과 같다.
표 형태의 데이터 : SQL 쿼리 결과는 여러 행과 열로 구성된 표와 같다. ResultSet은 이 표 전체를 메모리에 담지 않고, 커서를 이용해서 한 행씩 접근할 수 있도록 한다.
커서(Cursor) 사용 : ResultSet에는 현재 위치를 나타내는 커서가 있다. 처음에는 커서가 첫 번째 행 전에 위치하므로, next() 메서드를 호출해 다음 행으로 이동해야 데이터를 읽을 수 있다.
데이터 읽기 메서드 : 각 행의 데이터를 읽기 위해 getString(), getInt(), getLong() 등의 메서드를 사용한다. 이 메서드들은 열 이름이나 인덱스를 인자로 받아 해당 열의 데이터를 반환한다.
✍️ 예시 코드 작성
public class ResultSetExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "username";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
// ResultSet: SQL 쿼리 실행 결과를 담는 객체, 각 행의 데이터를 순차적으로 읽어올 수 있음
ResultSet rs = stmt.executeQuery("SELECT id, name, email FROM users")) {
// while문: rs.next() 호출로 커서를 다음 행으로 이동, 다음 행이 있으면 true 반환
while (rs.next()) {
// rs.getInt("id"): 현재 행에서 "id" 컬럼의 정수 값을 가져옴
int id = rs.getInt("id");
// rs.getString("name"): 현재 행에서 "name" 컬럼의 문자열 값을 가져옴
String name = rs.getString("name");
// rs.getString("email"): 현재 행에서 "email" 컬럼의 문자열 값을 가져옴
String email = rs.getString("email");
// 각 행의 데이터를 출력
System.out.println(id + " - " + name + " - " + email);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
멋쟁이사자처럼 강의자료