Statement vs PreparedStatement

2022. 12. 3. 22:37·CS/데이터베이스

깃헙 블로그에서 편하게 보기 Click!

Statement

데이터베이스에 액세스 하는 데 사용된다. Statement 인터페이스는 매개 변수를 허용할 수 없으며 런타임에 정적 SQL문을 사용할 때 유용하다.

SQL 쿼리를 한 번만 실행하려는 경우 Statement 인터페이스가 PreparedStatement보다 선호된다.

Connection con = DriverManager.getConnection();

// Statement 객체 생성
Statement stmt = con.createStatement();

// Statement 실행
stmt.executeUpdate("CREATE TABLE STUDENT(ID NUMBER NOT NULL, NAME VARCHAR)");



PreparedStatement

SQL 명령문을 DBMS에 보낼 때마다 DBMS는 매번 아래의 작업을 반복하게 된다.

1️⃣ SQL문자열 컴파일
2️⃣ 컴파일 된 SQL 명령문 실행
3️⃣ 실행 결과를 호출자에게 리턴

만약 우리가 특정 테이블에 계속해서 데이터를 입력할 경우, SQL 명령문은 대부분 동일하고 입력되는 데이터 값만 다를 것이다.

따라서 위의 세가지 과정을 매번 반복하는 것보다는 재사용하는 것이 바람직할 것이고, 그래서 등장한 것이 PreparedStatement이다.

나중에 값을 설정하기 위해 ?을 사용하고 이 기호는 1부터 시작되는 인덱스를 가진다.
?은 전달되는 위치에서만 사용될 수 있고, 테이블이나 컬럼 이름과 같은 위치에는 사용될 수 없다.

PreparedStatement 인터페이스를 사용하면 재사용성이 높아질 뿐만 아니라 코드가 간결해지기에 가독성도 높아진다.

PreparedStatement 인터페이스는 런타임에서 입력 매개 변수를 허용한다.

 

1~10번까지의 사원의 이름을 조회하는 경우를 생각해보자.

1) Statement 객체 사용

Statement stmt = con.createStatment(); 

for (int i = 1; i <= 10; i++) {
    rs = stmt.executeQuery(“select * from emp where no=“+i+ “ and name=‘”+name[i]+”’”);
}

DBMS가 매번 쿼리를 새로 생성해야 할 뿐만 아니라 “, +, ‘ 등의 잦은 사용으로 인해 가독성도 저하된다.

 

2) PreparedStatement 객체 사용

PreparedStatement pstmt = con.prepareStatement(“select * from emp where no=? and name=?”); 

for (int i = 1; i <= 10; i++) {
    pstmt.setInt(1, i); 
    pstmt.setString(2, name[i]); 
    rs = pstmt.executeQuery();
}

반면 PreparedStatement 객체를 사용할 경우 ? 자리에 필요한 컬럼 값을 쉽게 읽을 수 있기 때문에 가독성도 높고 재사용성도 좋아진다.



한눈에 비교하는 Statement vs PreparedStatement

Statement PreparedStatement
SQL 쿼리 한 번 실행시 사용 SQL 쿼리 여러 번 실행시 사용
런타임에 매개 변수 전달 불가능 런타임에 매개 변수 전달 가능
CREATE, ALTER, DROP 문에 사용 여러 번 실행될 쿼리에 사용
성능 낮음 성능 우수
기본 인터페이스 Statement 확장한 것
일반 SQL 쿼리 실행시 사용 동적 SQL 쿼리 실행시 사용
이진 데이터 읽기/쓰기 불가능 이진 데이터 읽기/쓰기 가능
DDL문에 사용
(CREATE, ALTER, DROP, TRUNCATE)
모든 SQL 쿼리에 사용



References

  • geeksforgeeks.org/difference-between-statement-and-preparedstatement
반응형
저작자표시 비영리 변경금지 (새창열림)

'CS > 데이터베이스' 카테고리의 다른 글

NoSQL  (0) 2022.12.05
인덱스(Index)  (0) 2022.11.21
데이터베이스  (0) 2022.11.14
'CS/데이터베이스' 카테고리의 다른 글
  • NoSQL
  • 인덱스(Index)
  • 데이터베이스
yenim
yenim
    반응형
  • yenim
    FOREST, FOR REST
    yenim
  • 전체
    오늘
    어제
    • 분류 전체보기 (235)
      • Android (9)
      • Baekjoon (142)
        • 구현 (3)
        • 브루트포스 (10)
        • BFS (12)
        • DFS (13)
        • 백트래킹 (3)
        • DP (26)
        • 최소 스패닝 트리 (1)
        • 이분 탐색 (10)
        • 그리디 알고리즘 (12)
        • 투포인터 (2)
        • 슬라이딩 윈도우 (2)
        • 다익스트라 (1)
        • 시뮬레이션 (6)
        • 분할 정복 (3)
        • 문자열 (9)
        • 정렬 (6)
        • 탐색 (2)
        • 수학 (20)
        • 링크드리스트 (1)
      • 프로그래머스 (15)
        • 구현 (4)
        • 브루트포스 (4)
        • DFS (1)
        • DP (1)
        • HEAP (1)
        • 문자열 (3)
        • 해시 (0)
        • 비트 (1)
      • CS (39)
        • 개발상식 (9)
        • 자료구조 (8)
        • 네트워크 (7)
        • 운영체제 (5)
        • 데이터베이스 (4)
        • 디자인패턴 (1)
        • 알고리즘 (5)
      • Programming Languages (3)
        • C & C++ (2)
        • Kotlin (1)
      • 취준 (7)
      • Git (2)
      • Google Online Challenge (4)
      • 에러 해결 (6)
      • WEB (0)
      • NOTE (3)
      • DIARY (3)
      • 알고리즘 (1)
  • 블로그 메뉴

    • 🏡 HOME
    • ✏️ TIL
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    깊이우선탐색
    그리디 알고리즘
    브루트포스
    다이나믹 프로그래밍
    BFS
    DP
    너비우선탐색
    프로그래머스
    코테
    문자열
    백준
    DFS
    CS
    명품 자바프로그래밍
    그래프
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
yenim
Statement vs PreparedStatement
상단으로

티스토리툴바