2011-02-26 6 views
0

db에서 레코드 목록을 가져 오기 위해 Spring 프레임 워크의 jdbcTemplate을 사용하고 있습니다. 이제 쿼리에 제약 조건을 추가하여 필터링을 추가하려고합니다. 예를 들어. 목록이 사람과 쇼 나타내는 말 - 이름, 이메일과 위치를복잡한 프레임 워크를 사용하는 스프링 프레임 워크의 jdbcTemplate 사용

원래 쿼리 필터에 따라

String sql = "SELECT name, email, location FROM persons WHERE status = ?"; 

입니다, 제약 조건이 추가됩니다

if(filters.containsKey("person_name")) { 
    sql += " AND name LIKE '%" + filters.get("person_name") + "%'"; 
} 

//similarly 
if(filters.containsKey("person_email")) { 
    .... 
} 

//similarly 
if(filters.containsKey("person_location")) { 
    .... 
} 

따라서 쿼리는 것이다 jdbcTemplate 객체의 질의 메소드에 전달하여 작성하고 실행한다.

this.jdbcTemplate.query(sql, new Object[] { 1 }, RowMapper<Person> rowmapper) 

필자는 위의 방법을 사용하여 필터가 적용된 값이 이스케이프없이 쿼리에 직접 기록되므로 주입에 취약해질 것이라고 우려했습니다.

쿼리가 작성된 것처럼 동적으로 두 번째 매개 변수 (arguments 배열)를 만들 수 있습니까?

jdbcTemplate을 사용하는 다른 방법이 있습니까?

편집 : 지금 값을 탈출 org.apache.commons.lang.StringEscapeUtils에서 StringEscapeUtils.escapeSql을 사용하고 . 그러나 여전히 더 좋은 방법이나 봄이 이미 제공 한 방법을 찾고 있습니다.

감사합니다.

답변

3

나는 더 좋은 방법이 있다고 생각합니다. 그런 다음 쿼리 방법에 filters.get ("PERSON_NAME")에 전달할 수 있습니다 코드

if (filters.containsKey("person_name")) { 
    sql += " AND name LIKE '%" + filters.get("person_name") + "%'"; 
} 

을 가지고

if (filters.containsKey("person_name")) { 
    sql += " AND name LIKE '%?%"; 
} 

로 변경. 이것은 주사 공격으로부터 당신을 안전하게 지켜줍니다. 나뿐만 아니라이 생각

응답에서

는 언급합니다. 그러나 어떻게 동적으로 객체의 배열을 만듭니다 (새로운 객체 [] {..})?

java.util.List를 사용하여 toArray() 메소드를 호출 할 수 있습니다. 종류의

import java.util.List; 
import java.util.ArrayList; 

List<Object> args = new ArrayList<Object>(); 

if (filters.containsKey("person_name")) { 
    sql += " AND name LIKE '%?%"; 
    args.add(filters.get("person_name")); 
} 

처럼 그럼 당신은 나뿐만 아니라이 생각 배열

args.toArray(); 
+0

로 인수를 필요로 할 때. 그러나 객체 배열 ('new Object [] {..}')을 동적으로 생성하는 방법은 무엇입니까? – naiquevin

+0

내 업데이트 된 답변보기 –

+0

는 알아 냈어야합니다 :) .. thanks a ton – naiquevin

관련 문제