jinsiri 2019. 6. 12. 19:06

Statement

DML 메소드를 실행하는 시점에 파라미터로 SQL문을 DB에 전달한다.

장점 - 사용된 SQl문 전체를 명확히 할수 있어서 디버깅이 쉽다.

단점 - 사용자가 입력한 데이터가 SQL문장을 구성할 수 있다.

ex. select count(*) cnt from membership where id='a' or 1=1 -- ' and pass='1234'

ex. stmt= conn.createStatement();

     String sql="insert into person values(1,'"+변수+"',13'학생); <- 변수에 sql문이 들어와도 실행된다.

     stmt.excuteUpdate(sql); <-- 사용자가 입력한 데이터를 최종적으로 sql실행하게 된다.

 

PreparedStatement

Statement를 부모로 가지는 자식이다.

사용목적: SQL Injection에 있다. 

 

장점:  파싱을 한번하기에 빠르다.

        따옴표와 자료형을 신경쓰지 않아도 된다.

        사용자가 입력한(sql 구문) 데이터가 변경될 염려가 없다. 

        커넥션에서 생성하면서 SQL문이 DB에 전송되어진다.

단점: 오류발생시 변수에 입력되는 값을 알 수 없어서 디버깅이 어렵다.

한번만 파싱하고 값을 바꾼다.

 

사용법. 

String sql ="insert into person values(?,?,?,?)"; // - ?는 바인드 변수를 뜻한다.
stmt= conn.prepareStatement(sql); // <- 데이터가 빠진 sql을 전송
// ?수만큼 설정한다.
stmt.setInt(1,1);
stmt.setString(2,name); // <-변수 name
stmt.setInt(3,13);
stmt.setString(4,"학생");

stmt.executeUpdate(); // * 주의- excute()메소드 내에 sql기입하면 안된다.

          

반응형