티스토리 뷰

Java/개념정리

[ Java ] JDBC - PreparedStatement

통통푸딩 2020. 12. 8. 21:11
반응형

Java에서 DB를 사용할 때,

자바프로그램은 DB 쪽으로 SQL 문을 전송하고, DB는 처리된 결과를 다시 자바프로그램 쪽으로 전달해야 합니다. 이 역할을 하는 객체가 Statement입니다. 자세한 내용은 이전 포스팅을 참고하여주세요.

 

2020/12/08 - [웹 개발/Java] - [ Java ] JDBC 사용하는 방법

 

[ Java ] JDBC 사용하는 방법

 JDBC란? JDBC란, 자바 언어로 다양한 종류의 관계형 데이터베이스에 접속하고 SQL문을 수행하여 처리하고자 할 때 사용되는 표준 SQL 인터페이스 API입니다. 즉, 자바에서 데이터베이스를 사용하기

codingwell.tistory.com

 

 PreparedStatement 사용법 

그런데 이때, Statement를 사용하지 않고 PreparedStatement를 사용할 수 있다.

Statement과 다르게 PreparedStatement 객체를 생성할 때 인자값으로 실행할 sql문을 지정해야합니다.

이 때, sql문의 값을 동적으로 지정해야할 때 기호 ? 로 대체할 수 있습니다. 

String title = '안녕', writeId = 'candy';


Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:xepdb1";
Connection con = DriverManager.getConnection(url,"kim","1234");



String sql = "insert into notice (TITLE, WRITER_ID) values (?, ?)";
PreparedStatement pst = con.prepareStatement(sql);



pst.setString(1,title);
pst.setString(2,writeId);


int result = pst.executeUpdate();

PreparedStatement 객체에서 제공하는 setter 메소드를 이용해 sql문의 값을 지정합니다.

첫번째 인자값으로 넣을 값의 순서를, 두번째 인자값으로 넣을 값을 입력합니다.

 

 또한 , executeUpdate() 메소드는 (insert/update/delete)로 영향받은 레코드의 개수를 반환합니다.

 

 

 

 

 

 


 PreparedStatement 장점 

 

1. 가독성와 유지보수가 좋다.

Statement와 PreparedStatement를 비교해보면 쉽게 알 수 있습니다.

//Statement
Statement st = con.createStatement();
st.executeQuery("insert into notice(TITLE, WRITER_ID) values('"+title+"', '"+writeId+"')");


//PreparedStatement
PreparedStatement pst = con.prepareStatement("insert into notice (TITLE, WRITER_ID) values(?, ?)");
pst.setString(1, title);
pst.setString(2, writerId);
pst.executeUpdate();

Statement의 executeQuery 메소드를 사용할 경우 넣을 값을 작은 따옴 쉼표를 짝을 맞추어 넣어주어야 합니다.

그런데 실제로 이런 쿼리를 작성하다보면 하나를 빠트려 먹어 오류가 발생할 때가 빈번합니다.

그렇지만 PreparedStatement는 ? 기호로 대체하기 때문에 가독성과 유지보수가 뛰어납니다.

 

 

 

 

2. 쿼리 실행 계획을 재사용하여 성능을 높일 수 있다.

Statement를 사용하여 SELECT 쿼리를 입력했을 때에는 매번 parser와 fetch까지 모든 과정을 수행합니다. 그러나 PreaparedStatement 경우에는 효율을 높이기 위해 parse과정을 최초 한번만 수행하고 이후에는 메모리 어딘가에 저장 해두고 필요할 때마다 사용합니다. 이는 퍼포먼스를 높입니다.

 

 

 

 

 

3. SQL인젝션 취약점을 보완할 수 있다.

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday