JAVA 에서 prepared Statement 과 Statement 의 차 이 는?

2779 단어 자바sql
1. 코드 의 가 독성 과 유지 가능성.
Statement 대신 Prepared Statement 을 사용 하면 코드 가 몇 줄 더 많 지만 이러한 코드 는 가 독성 이나 유지 가능성 에 있어 서 모두 Statement 을 직접 사용 하 는 코드 보다 훨씬 높 습 니 다.

		stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"
				+ var1 + "','" + var2 + "'," + var3 + ",'" + var4 + "')");

		perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
		perstmt.setString(1, var1);
		perstmt.setString(2, var2);
		perstmt.setString(3, var3);
		perstmt.setString(4, var4);
		perstmt.executeUpdate();

내 가 더 말 할 필요 가 없다. 첫 번 째 방법 에 대해 서 는 다른 사람 이 너의 코드 를 읽 는 것 은 말 할 것 도 없고, 바로 너 자신 이 시간 이 좀 지나 서 다시 읽 으 면 모두 슬퍼 할 것 이다.
2. Prepared Statement 은 가능 한 한 성능 을 향상 시 킵 니 다.
모든 데이터 베 이 스 는 사전 컴 파일 문 구 를 최대한 최적화 시 키 기 위해 최선 을 다 합 니 다. 사전 컴 파일 문 구 는 중복 호출 될 수 있 기 때문에 문 구 는 DB 의 컴 파일 러 에 의 해 컴 파일 된 실행 코드 가 캐 시 되 어 있 습 니 다. 다음 호출 시 같은 사전 컴 파일 문 구 는 컴 파일 이 필요 하지 않 습 니 다. 컴 파일 된 구문 실행 코드 에 파 라 메 터 를 직접 전송 하면 됩 니 다.(하나의 함수 에 해당)실 행 됩 니 다. 커 넥 션 에서 여러 번 실행 되 는 사전 컴 파일 문 만 캐 시 되 는 것 이 아니 라 전체 DB 에서 사전 컴 파일 된 구문 문법 과 캐 시 에 일치 하기 만 하면 언제든지 다시 컴 파일 하지 않 고 바로 실행 할 수 있 습 니 다. statement 의 문 구 는 같은 동작 이 더 라 도 매번 작 동 하 는 데이터 가 다 르 기 때문에 전체 언어 를 실행 할 수 있 습 니 다.문장 이 일치 하 는 기 회 는 매우 작 아서 거의 일치 할 수 없다. 예 를 들 어:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
같은 동작 이 더 라 도 데이터 내용 이 다 르 기 때문에 전체 문장 자체 가 일치 하지 않 고 캐 시 문장의 의미 가 없습니다. 사실은 데이터베이스 가 없 으 면 일반 문 구 를 컴 파일 한 후의 실행 코드 캐 시 입 니 다. 이렇게 실행 할 때마다 들 어 오 는 문 구 를 한 번 씩 컴 파일 해 야 합 니 다. 물론 사전 컴 파일 된 문 구 는 반드시 캐 시 되 고 데이터 베이스 자체 가 하나의 전략 을 사용 합 니 다. 예 를 들 어주파수 등 요 소 를 사용 하여 기 존의 사전 컴 파일 결 과 를 언제 캐 시 하지 않 을 지 결정 합 니 다. 새로운 사전 컴 파일 문 구 를 저장 할 공간 이 더 많 습 니 다.
3. 가장 중요 한 것 은 안전성 을 크게 향상 시 켰 다 는 것 이다.
아직도 기본 적 인 악의 SQL 문법 도 모 르 는 사람 이 있다.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
만약 우리 가 [or '1' = '1] 을 varpasswd 로 전달한다 면, 사용자 이름 은 마음대로, 무엇이 될 지 봅 시다.
select * from tb name = '임의의' and passwd = '또는' 1 '=' 1 ';
'1' = '1' 은 반드시 성립 되 기 때문에 모든 검증 을 통과 할 수 있 습 니 다. 더욱 심 한 것 은:
varpasswd 로 [; drop table tb name;] 을 들 여 오 면:
select * from tb name = '임 의' and passwd = ', drop table tb name; 일부 데이터 베 이 스 는 성공 하지 못 하지만 이 문 구 를 실행 할 수 있 는 데이터베이스 도 많 습 니 다.
사전 컴 파일 문 구 를 사용 하면 들 어 오 는 모든 내용 이 원래 의 구문 과 일치 하 는 관 계 를 가지 지 않 습 니 다. (전 제 는 데이터베이스 자체 가 사전 컴 파일 을 지원 하지만, 이전 에는 컴 파일 을 지원 하지 않 는 서버 데이터베이스 가 없 을 수도 있 습 니 다. 소수의 데스크 톱 데이터 베 이 스 는 직접 파일 에 접근 하 는 것 입 니 다)사전 컴 파일 문 구 를 모두 사용 하기 만 한다 면 들 어 오 는 데 이 터 를 지나치게 걱정 할 필요 가 없습니다. 일반적인 statement 을 사용 하면 drop, 등 심혈 을 기울 여 판단 하고 지나치게 걱정 해 야 할 수도 있 습 니 다.

좋은 웹페이지 즐겨찾기