2020-10-30 TIL
1 minute read
JDBC
Statement vs PreparedStatement
Statememt
- SQL 문법 + 값 -> SQL 문장 -> DBMS 프로토콜에 맞춰 가공 -> 가공된 SQL 문장 -> 전송 -> DBMS와 통신
- 값을 이용하여 SQL 문을 만들기 때문에 조작이 발생할 수 있다.
PreparedStatement
- SQL 문법 -> SQL 문장 -> DBMS 프로토콜에 맞춰 가공 -> 가공된 SQL 문장 + 값 -> 전송 -> DBMS와 통신
- SQL 을 가공한 후에 값을 첨부하기 때문에 SQL 문을 조작할 수 없다.
- 미리 SQL 문장을 준비하여 값을 삽입하는 기법이다.
- PreparedStatement stmt = con.prepareStatement(SQL문);
- 앞은 Prepared, 뒤는 prepare이다.
- SQL 문을 준비할 때 값이 들어 갈 자리에 ? 로 표시한다.
- 값이 들어가는 역할을 하는 것(여기서는 ?)을 인 파라미터라고 한다.
- 서버에 전달하기 위해 in-parameter 자리에 값을 넣는다.
- PreparedStatement.setXxx(in-parameter 인덱스, 값);
- setXxx : 컬럼의 타입에 따라 setInt, setDate, setString 등을 사용할 수 있다.
- In-parameter
Statement vs PreparedStatement 2
- SQL 공격 :
- Statement는 가능, PreparedStatement는 불가능.
- Statement는 값과 함께 SQL 문장을 만들기 때문이다.
- binaryData 입력 :
- Statement는 불가능, PreparedStatement는 가능.
- Statement는 SQL 문과 값을 묶어서 문자열로 표현하기 때문
- PreparedStatement는 SQL 문과 값이 분리되어 있다.
- 실행 속도 :
- Statement는 한번에 반복하여 실행할 경우 매번 SQL 문을 DBMS 프로토콜에 맞게 가공(parsing) 해야 하기 때문에 느릴 수 있다.
- PreparedStatement는 일단 SQL 문을 DBMS 프로토콜에 맞춰 가공해 둔 다음에 값과 함께 보내기 때문에 한 번에 여러번 반복하여 실행하는 경우 Statement 보다 빠르다.
자식 테이블의 데이터를 함께 입력할 때 문제점
- 첨부 파일 테이블에 데이터를 입력하려면, 게시글 테이블의 게시글 번호를 알아야 한다.
- 문제는 바로 위에서 입력한 게시글의 PK가 자동 생성되는 컬럼이기 때문에 입력한 후 그 PK 값이 뭔지 알 수가 없다는 것이다.
- 그래서 첨부 파일 테이블에 데이터를 입력할 수 없다.
- 해결책 :
- 데이터를 입력할 때 자동 생성된 PK 값을 알 수 있다면 이 문제를 해결할 수 있다.
- PreparedStatement에
auto-commit 의 문제점
프로젝트 (33-b 소스코트를 client에 복사 붙여넣기)
- 마리아DB가 사용 가능하도록 만든다.
- DBMS 에 테이블 생성.
- 데이터 핸들러 리스너에서 데이터를 파일로 저장하고 로드하는 코드를 제거한다.
- BoardXxxhandler 변경
- 데이터를 저장하고 꺼낼 때 jdbc API를 사용한다.
- App 변경(생성자 없음)
- listcommand 변경
- try 안에는 auto-closable 변수 선언만 올 수 있다.