2011-11-22 2 views
1

mysql 테이블의 대부분의 열에서 결과를 검색하고 반환 할 수 있기를 원합니다. 나는 myisam db와 전체 텍스트 검색을 사용하는 것을 고려했지만, 성능에 영향을 미치므로 innodb를 고수하는 것이 더 좋을 것이라고 결정했습니다. 나는 또한 Solr과 같은 것을 사용하는 것을 간략하게 생각했다. 그러나 그와 같은 해결책은 내 상황에서 과도한 것처럼 보인다.준비된 문을 사용하여 여러 열의 SQL 쿼리

나는 단순히 연락처 정보 데이터베이스에 검색 기능을 추가하려고합니다. 사용자가 "Smith"라고 말하면 결과가 반환되고 이름, 성 또는 주소에 Smith라는 단어가 포함 된 모든 표 행이 표시되기를 원합니다.

이 방법이 잘못된 방법인지 알려주지 만 이 같은 설정은 표준 SQL 문자열을 사용하여 정착 :이 테이블의 컬럼의 대부분을 포함하기 때문에

SELECT * FROM contacts WHERE firstName LIKE ? OR lastName LIKE ? OR email LIKE ? 

은 물론 실제 쿼리 문자열은 상당히 이상이 예보다됩니다.

1) 보안을 위해 데이터베이스를 쿼리 할 때 준비된 문을 사용하는 것을 선호하지만 SQL 문자열을 위의 방법으로 설정할 때 코드는 각 문에 대해 별도의 문을 찾습니다. 어떻게 똑같은 "똑같이"반복 할 수 있을까요? 각 열에 대해? 내가 처음의 PreparedStatement로 문자열을 전달하면

SELECT * FROM contacts WHERE firstName, lastName, email LIKE ? 

, 나는 그것이 와일드 카드 (%)로 둘러싸 : 또는 유사한이를 설정하는 방법이있다.

2) VARCHAR 및 INT 열을 모두 검색 할 수 있습니까?

EDIT : 명명 된 매개 변수를 사용할 수 있도록 Spring 프레임 워크의 일부만 사용하여 종료했습니다. 불행하게도 JDBC에는이 기능이 없습니다. 이것은 jdbc jar를 사용할 수 있도록 빌드 경로에 Spring 프레임 워크의 작은 부분을 포함하는 것을 의미했습니다. 또는 쿼리 문자열의 각 매개 변수에 대해 하나의 검색 문자열을 전달할 수는 있지만, 결과적으로 코드를 읽기가 어렵거나 어렵습니다. 동일한 문자열을 사용하여 해킹하지 않으려 고했습니다. 매개 변수.

답변

1

아니요. 그렇게 할 수 없습니다. 첫 번째 쿼리에서 어떻게 사용했는지를 묻는 메시지가 표시됩니다.

SELECT * FROM contacts WHERE firstName LIKE ? OR lastName LIKE ? OR email LIKE ? 
+0

나는 그렇게 생각합니다. preparedstatements를 사용하는 것은 어떻습니까? 하나의 값만 전달하고 모든 값을 사용할 수 있습니까? 문자열에? – ryandlf

+0

그렇지 않으면 매개 변수 'numbers'를 기반으로하므로 명명 된 매개 변수 (예 : : foo)를 사용할 수 있어야합니다. – judda

+0

오류 ... 불행히도 JDBC를 사용하고 있으며 명명 된 매개 변수를 지원하지 않습니다. – ryandlf

관련 문제