2017-03-11 6 views
0

쿼리 처리에 Prepared Statement를 사용하려고합니다. 문제는 사용자 입력을 기반으로 쿼리를 변경하는 else 문이 있으면 severals가 있다는 것입니다.복잡한 쿼리에서 Prepared Statement 사용

여기 PreparedStatement이 경우 도움이되지 않습니다 내 코드

   if( !star_firstName.isEmpty() || !star_lastName.isEmpty() ){ 
        baseQuery = "select m.id, title, year, director, banner_url, trailer_url from movies m, stars s, stars_in_movies sim WHERE m.id=sim.movie_id AND s.id=sim.star_id"; 
       } 
       if(!searchtext.isEmpty()) 
        baseQuery = baseQuery + " AND upper(title) like '%" + searchtext.toUpperCase() + "%'" ; 
       if(!movie_year.isEmpty()) 
        baseQuery = baseQuery + " AND year=" + movie_year; 
       if(!movie_director.isEmpty()) 
        baseQuery = baseQuery + " AND upper(director) like '%" + movie_director.toUpperCase() + "%'"; 
       if(!star_firstName.isEmpty()) 
        baseQuery = baseQuery + " AND upper(first_name) like '%" + star_firstName.toUpperCase() + "%'" ; 
       if(!star_lastName.isEmpty()) 
        baseQuery = baseQuery + " AND upper(last_name) like '%" + star_lastName.toUpperCase() + "%'" ; 

       if(!title1.isEmpty()){ 
        baseQuery = "SELECT m.id, title, year, director, banner_url, trailer_url FROM movies m where m.title like '" + title1 + "%" + "'"; 

       } 
       if( !genre.isEmpty()){ 
        baseQuery = "SELECT m.id, title, year, director, banner_url, trailer_url FROM movies m, genres g, genres_in_movies gim where g.id=gim.genre_id and m.id = gim.movie_id and g.name='" + genre + "'"; 
       } 



       System.out.println(baseQuery); 
       ResultSet resultSet = statement.executeQuery(baseQuery); 
+1

질문 무엇입니까? –

+0

오, 미안해, 내 주된 질문을 잊어 버렸다. 코드 스 니펫은 작동하지만 PreparedStatement를 사용하여 성능을 최적화하려고합니다. . 내 질문에 어떻게 PreparedStatement 사용하여 동일한 결과를 얻을 수 있습니까? –

답변

0

입니다.

PreparedStatement은 쿼리가 동일하게 유지되고 그 값이 모두 상수 일 때만 성능을 향상시킵니다.

PreparedStatement의 다른 용도는 SQL 삽입의 위험을 피하기위한 것입니다. 그게 당신이 후에 무엇 있다면 ,이 (테스트되지 않은)처럼 진행할 수 :

java.util.Vector<String> params = new Vector(); 
StringBuffer baseQuery = new StringBuffer("SELECT ..."); 

... 

if (!dweebnoid.isEmpty()) { 
    baseQuery.append(" AND upper(dweebnoid) LIKE ?"); 
    params.add("%" + dweebnoid + "%"); 
} 

... 

java.sql.PreparedStatement pstmt = 
    conn.prepareStatement(baseQuery.toString()); 
for (i=0; i<params.size();++i) 
    pstmt.setString(i+1, params.get(i)); 
java.sql.ResultSet resultSet = pstmt.executeQuery(); 
+0

고맙습니다.하지만 prepareStatement에 이것을 쓰는 방법을 알려 주시면 좋을 것 같습니다. 나도 SQL 주입을 피하려고한다. –

+0

예제를 추가했습니다 (모든 매개 변수가 문자열이라고 가정하고 필요에 맞게 코드를 수정하십시오). –