Language/Java

Statement와 PreparedStatement 차이

JUNGKEUNG 2021. 6. 30. 20:30
반응형

Statement

Statement를 사용하면 매번 쿼리를 수행할 때마다 3단계를 거치게 되고(계속적으로 단계를 거치면서 수행)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;


public class JdbcStatement {

    public static void main(String[] args) throws Exception {

        String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=UTF-8&serverTimezone=UTC";
        Connection conn = null;
        Statement stmt = null;
        long start = System.currentTimeMillis ();

        String num, name, addr, phone;

        String sql = "Insert Into member (num, name, addr, phone) Values";
        try {
            BufferedReader br = new BufferedReader ( new InputStreamReader ( System.in ) );
            System.out.println ( "Member 테이블에 값 추가하기....." );

            System.out.print ( "학번 입력  :" );
            num = br.readLine ();

            System.out.print ( "이름 입력 :" );
            name = br.readLine ();

            System.out.print ( "주소 입력 :" );
            addr = br.readLine ();

            System.out.print ( "전화번호 입력 :" );
            phone = br.readLine ();


            sql += "('" + num + "','" + name + "','" + addr + "','" + phone + "')";
            System.out.println ( sql );

            conn = DriverManager.getConnection ( url, "root", "1234" );

            //기존 statement객체로 실행하는 방법
            stmt = conn.createStatement ();
            stmt.executeUpdate ( sql );


            System.out.println ( "Insert 성공" );
        } catch (Exception e) {
            System.out.println ( "데이터베이스 연결 실패!= " + e.getMessage () );
        } finally {
            try {
                stmt.close ();
            } catch (Exception ignored) {
            }
            try {
                conn.close ();
            } catch (Exception ignored) {
            }
        }
        long end = System.currentTimeMillis ();
        System.out.println ( "실행 시간 : " + (end - start) / 1000.0 );
    }
}

실행시 비슷한 시간이 나오는걸 알수가있다

PreparedStatement

PreparedStatement는 처음 한 번만 3 단계를 거친 후 캐시에 담아 재사용 한다

만약 동일한 쿼리를 반복적으로 수행한다면 PreparedStatment가 Db에 훨씬 적은 부하를 주며, 성능도 좋다

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class JdbcPreparedStatement {

    public static void main(String[] args) throws Exception {

        String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=UTF-8&serverTimezone=UTC";
        Connection conn = null;
        PreparedStatement pstmt = null;
        String num, name, addr, phone;

        long start = System.currentTimeMillis();

        String sql="Insert Into member (num, name, addr, phone) Values(?,?,?,?)"; //?는 1,2,3,4번순이다.
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Member 테이블에 값 추가하기.....");

            System.out.print("학번 입력  :");
            num = br.readLine();

            System.out.print("이름 입력 :");
            name = br.readLine();

            System.out.print("주소 입력 :");
            addr = br.readLine();

            System.out.print("전화번호 입력 :");
            phone = br.readLine();

            conn = DriverManager.getConnection(url, "root","1234");

            pstmt = conn.prepareStatement(sql); //PreparedStatement객체 얻어오기
            pstmt.setString(1, num); //첫번째 물음표를 1번이라하고 여기에  num을 대입
            pstmt.setString(2, name); //두번째 물음표를 1번이라하고 여기에  name을 대입
            pstmt.setString(3, addr);  //세번째 물음표를 1번이라하고 여기에  addr을 대입
            pstmt.setString(4, phone); //네번째 물음표를 1번이라하고 여기에  phone을 대입
            pstmt.executeUpdate();
            System.out.println("Insert 성공");
        } catch (Exception e) {
            System.out.println("데이터베이스 연결 실패!= "+e.getMessage());
        } finally {
            try {pstmt.close();
            } catch (Exception ignored){}
            try {conn.close();
            } catch (Exception ignored) {}
        }
        long end = System.currentTimeMillis();
        System.out.println( "실행 시간 : " + ( end - start )/1000.0 );
    }
}

두번 실행시 시간이 단축 되는걸 알수 있다.

Statement와 PreparedStatement 차이점

Statement PreparedStatement 두개의 큰차이는 캐시 사용여부 이다

1. 쿼리 문장 분석

2. 컴파일

3. 실행

 

DB의 종류에 따라 상황이 달라진다.

오라클 DB서버에서는 속도 차이가 나지만 MySQL 같은 경우는 성능차이가 거의 나지 않는다.

Dynamic SQL같은 경우는 매번 조건절이 틀려지게 됨으로 statement가 낫다. 즉 캐싱의 장점을 잃어버리게 된다.

또한 Dynamic SQL일 경우 코딩도 Statement가 훨신 편하다.

'Language > Java' 카테고리의 다른 글

GC 가비지 컬렉션 이란?  (0) 2021.07.05
프로세스와 스레드 차이점  (0) 2021.06.30
Eclipse spring 설치  (0) 2021.06.02
Big-O 표기법  (0) 2021.05.30
Scanner vs BufferedReader  (0) 2021.05.29