PreparedStatement ( + statement), ResultSet

0

SQL

목록 보기
9/11

Statement, PreparedStatement

: 오라클 DB에 쿼리를 날리는 방식

  • Statement : SQL Injection이라는 취약점을 가지고있어 사용하길 권장하지 않는다.
    -> PreparedStatement 사용해라.
  • 둘의 차이점 ? 캐시 사용 유무.
    • PreparedStatement는 객체를 캐시에 담아 재사용합니다.
      -> 반복적으로 쿼리를 수행할 경우 성능이 더 좋다.
  • 변수를 넣는 VALUES의 값에 물음표 (?) 를 사용하고, 물음표 자리에 set[자료형](?의 순서, 들어갈 값) 을 이용하여 값을 대입할 수 있다.
    ex) pstmt.setString(1, "ABC") / pstmt.setInt(2,3);
  • sysdate를 사용할 경우, sql문을 생성할 때 sysdate 라고 넣어주면 된다.
    ex)
String sql = "insert customer(name,age,addr,enrollDate) values (?,?,?,sysdate)
  • DB에 쿼리날리기
    pstmt.executeUpdate(sql);

executeQuery와 executeUpdate의 차이점?

  • executeQuery는 ResultSet을 만드는 sql문에서 사용하며, 주로 select문을 수행할 때 사용한다.
  • executeUpdate는 insertupdate와 같은 ddl, dml을 실행할 때 사용함.

ResultSet?

  • SQL문 중에서 select문을 사용하는 경우 ResultSet을 반환한다.
    statement의 executeQuery() 메서드는 select 쿼리를 실행할 때 사용되며, select 쿼리의 실행결과를 java.sql.ResultSet 객체에 담아서 리턴(SQL 쿼리에 의해 생성된 테이블의 값을 가지게 됨)한다.
    따라서 ResultSet 클래스가 제공하는 메서드를 사용해서 읽어올 수 있다.
  • ResultSet클래스는 next() 메서드를 제공하는데, next() 메서드를 사용해서 select 결과의 존재여부를 확인할 수 있다.
    • next() : 커서를 다음행으로 옮기고, 다음행이 있으면 true, 없으면 false를 리턴
      while문과 같이 쓸 경우, while(rs.next()) -> rs를 끝까지 돌 때까지 쿼리를 수행한다.
  • 또한 ResultSet 객체는 커서(cursor)를 가지고 있는데, ResultSet에서 특정 행에 대한 참조를 조작할 수 있다. 커서는 초기에 첫번째 행의 이전에 위치하도록 되어있다.
    ResultSet의 메서드를 이용하면 커서의 위치를 옮길 수 있다.
  • ResultSet 객체에서 현재 행의 필드명 혹은 레코드셋에서의 위치를 통해 어떤 필드의 값을 가져올 수 있는데, get[타입명]() 메서드를 이용하면 된다.
    • 해당 컬럼의 데이터 타입이 문자열이면 getString(), int면 getInt().
ResultSet rs = pstmt.executeQuery();
  • sql문을 담은 PreparedStatement를 executeQuery로 실행하고, 그 결과값을 ResultSet에 담아준다.

출처

profile
백엔드를 공부하고 있습니다.

0개의 댓글

관련 채용 정보