JDBC statement와 resultSet 생성
statement는 데이터베이스에서 실행해야할 쿼리문을 저장하고 실행할 수 있도록 하는 객체이다.
statement의 종류에는 statement, preparedStatement, callableStatement가 있다.
일반적인 sql문 실행에는 statement, preparedStatement가 사용되고 callableStatement는 프로시저 호출 시 사용된다.
public class Application {
public static void main(String[] args) {
Connection connection = getConnection();
Statement statement = null;
ResultSet resultSet = null;
try {
statement = connection.createStatement();
resultSet = statement.executeQuery("SELECT MENU_CODE,NAME,PRICE FROM TBL_MENU");
while (resultSet.next()) {
System.out.println(resultSet.getString("MENU_CODE") + ", " + resultSet.getString("NAME"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(resultSet);
close(statement);
close(connection);
}
}
}
statement는 쿼리문을 저장하고 실행하는 기능을 하는 용도의 인터페이스로 실행 결과의 반환 타입은 ResultSet이다.
생성한 connection의 createStatement 메소드를 호출하여 statement 인스턴스를 생성한다.
connection이 생성되지 않았다면 statement를 생성할 수 없다.
statement의 excuteQuery 메소드에 쿼리문을 문자열로 전달하면 실행 결과를 resultSet 타입으로 반환한다.
resultSet의 next메소드를 호출하면 포인터를 통해서 다음 행에 접근할 수 있다.
더이상 포인터가 가리키는 다음 값이 없다면 false를 가리킨다.
resultSet의 getString메소드를 사용하면 getString("컬럼명" or 컬럼순번) 형태로 컬럼의 값을 가져올 수 있다.
하지만 컬럼순번을 사용하게 되면 의미파악도 힘들고 쿼리문을 수정하게 되면 수정의 영향을 미치게 된다.
마지막으로 statement와 resultSet에 대한 자원 반납 역시 필요하다.
public class JDBCTemplate {
public static Connection getConnection() {
Connection con = null;
Properties prop = new Properties();
try {
prop.load(new FileReader("config/connection-info.properties"));
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
Class.forName(driver);
con = DriverManager.getConnection(url, prop);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
public static void close(Connection con) {
try {
if (con != null && con.isClosed()) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement statement) {
try {
if (statement != null && statement.isClosed()) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(ResultSet resultSet) {
try {
if (resultSet != null && resultSet.isClosed()) {
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
connection을 close했던 것과 동일한 로직으로 작성하며 오버로딩을 통해서 사용하는 쪽에서는 매개변수 타입이 달라도 import를 새롭게 할 필요가 없고 동일한 close 메소드 하나로 모든 자원을 반납할 수 있다.
'Backend > JDBC' 카테고리의 다른 글
PreparedStatement 생성 (0) | 2023.06.13 |
---|---|
JDBC DTO의 개념 (0) | 2023.06.12 |
JDBC Template 구현 (0) | 2023.06.10 |
JDBC 데이터베이스 접속 정보 분리 (0) | 2023.06.09 |
JDBC Connection 생성 (0) | 2023.06.08 |
댓글