2011-03-30 3 views
4

이전의 질문 중 하나 인 method design에 이어 간단한 문자열과 달리 매개 변수가있는 쿼리로 SQL 쿼리를 구현하는 것이 좋습니다.간단한 매개 변수화 된 쿼리로 인한 오류 - Java/SQL

나는 내가 다음 선택 문 가지고, 간단한 뭔가를 시작하기로 결정하기 전에 매개 변수화 된 쿼리를 사용한 적이 :이 나에게 다음과 같은 오류를 제공

String select = "SELECT * FROM ? "; 

PreparedStatement ps = connection.prepareStatement(select); 
ps.setString(1, "person"); 

을 : "[SQLITE_ERROR] SQL 오류 또는 누락 된 데이터베이스 (근처에 "?": 구문 오류) "

나는 다음 추가 기준이 수정 된 버전을 시도;

String select = "SELECT id FROM person WHERE name = ? "; 

PreparedStatement ps = connection.prepareStatement(select); 
ps.setString(1, "Yui"); 

이 첫 번째 예제에서는 매개 변수가있는 쿼리의 요점을 놓치고 있습니까? 아니면 잘못 구성 했나요?

감사합니다.

답변

9

간단히 말해 SQL 바인드는 절을 바인딩 할 수 없으며 절값 만 지정할 수 있습니다. 준비된 SQL 문을 "컴파일"하는 것과 관련하여 기술적 인 이유가 있습니다. 일반적으로 매개 변수화 된 쿼리는 SQL 주입을 방지하여 SQL을보다 안전하게 만들 수 있도록 설계되었으며 테이블 이름을 동적으로 설정할 수있는 정도까지 쿼리를 "모듈화"하는 측면의 이점이 있습니다 (이후 이미 테이블이 무엇인지 알 수 있습니다.)

+0

따라서 테이블 (SELECT * FROM person)의 모든 결과를 포함하는 ResultSet을 반환하려면 암시 ​​적으로 문자열로 입력하지 않고는 할 수 없습니까? –

+0

매개 변수가있는 쿼리로 선택 *을

에서 일반화 할 수 있는지 묻는다면 대답은 아니오입니다. 이것을 위해 전용 SQL이 있거나 select *의 제네릭 버전을 빌드해야합니다. –

+0

네, 그게 내가 의미하는 바입니다. 그건 수치 스럽습니다. 나는 마지막 명령이 실행 된 이후 변경된 내용으로 JTable을 업데이트 할 수 있도록 테이블을 새로 고치는 것보다 더 나은 방법을 알고 있습니까? –

1

준비된 명령문은 여전히 ​​SQL이므로 적절한 where 절로 구성해야합니다. 즉 x = y이다. 장점 중 하나는 전송 될 때마다가 아니라 처음 본 RDMS에 의해 구문 분석되어 서로 다른 바인드 값을 가진 동일한 쿼리의 후속 실행을 가속화한다는 것입니다. 당신이 직접 테이블의 모든 행을 원하는 경우

2

, 여기 당신이해야 할 일이다

String select = "SELECT * FROM person"; 

PreparedStatement ps = connection.prepareStatement(select); 

다른 사람이 위에서 언급 한 바와 같이 동적으로 테이블 이름을 결합하지 않는 바인딩 변수. 당신이 테이블 이름을 변수로 당신의 방법에 오는 경우 , 당신은 다음과 같이 전체 쿼리를 구성 할 수있다 :

String select = "SELECT * FROM " + varTableName; 
PreparedStatement ps = connection.prepareStatement(select); 

매개 변수화 된 쿼리 필드 이름을 쿼리 할 수 ​​있습니다 -하지 테이블 이름!

+0

자세한 예제를 보내 주셔서 감사합니다. –

관련 문제