본문 바로가기
Backend/JDBC

JDBC statement와 resultSet 생성

by Forsaken Developer 2023. 6. 11.
728x90
728x90

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 메소드 하나로 모든 자원을 반납할 수 있다. 
 

728x90
반응형

'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

댓글