2015-05-01 3 views
0

У меня три поляКак сформировать запрос SQL динамически на основе поля ввода значения

String stateID = ""; 
String districtID = ""; 
String talukaID = ""; 

Эти три поля могут быть пустыми или могут иметь значения

Описание таблицы

desc tbl_dealer 

contactName 
phone1 
stateID 
districtID 
talukMandalID 

на основе значений recivied, я должен написать SQL-запрос динамически

На основании значений recivied, я должен написать SQL-запрос динамически

Например

если все три пустые

select contactName , phone1 from tbl_dealer 

Если stateID пусто, то (удаление состояния из запрос)

select contactName , phone1 from tbl_dealer where districtID = "'+districtID+'" AND talukaID = "'+talukaID+'" 

И точно так же для всех случаев

Не могли бы вы, пожалуйста, дайте мне знать, как можно эффективно wrie это,

ответ

2

Я хотел бы предложить, сначала создать метод:

private void appendFilter(StringBuilder sb, String fieldName, String fieldValue) { 
    if(fieldValue != null && !fieldValue.trim().equalsIgnoreCase("")) { 
     sb.append("AND "+fieldName+"='"+fieldValue+"'"); 
    } 
} 

Затем использовать этот метод:

StringBuilder sb = new StringBuilder(); 
sb.append("select contactName , phone1 from tbl_dealer where 1=1 "); 
appendFilter(sb, "districtID", districtID); 
appendFilter(sb, "stateID", stateID); 
appendFilter(sb, "talukaID", talukaID); 
final String query=sb.toString(); 
+0

Я предлагаю использовать StringBuilder вместо StringBuffer здесь. StringBuffer синхронизирован и, следовательно, менее эффективен. – u6f6o

+0

хорошее решение, спасибо kartic. – Kiran

+0

О! да, пожалуйста, используйте StringBuilder. – Kartic

1

You должен использовать PreparedStatement с переменными привязки, чтобы исключить вероятность внедрения SQL (и включить БД для кэширования запроса):

PreparedStatement ps = null; 
try { 
    List<String> bindVariables = new ArrayList<>(); 
    StringBuilder query = new StringBuilder(
     "select contactName, phone1 from tbl_dealer WHERE 1=1"); 

    if (stateID.length > 0) { 
     query.append(" AND stateID = ?"); 
     bindVariables.add(stateID); 
    } 
    if (districtID.length > 0) { 
     query.append(" AND districtID = ?"); 
     bindVariables.add(districtID); 
    } 
    if (talukaID.length > 0) { 
     query.append(" AND talukaID = ?"); 
     bindVariables.add(talukaID); 
    } 
    ps = myConnection.prepareStatement(query.toString()); 

    for (int i = 0; i < bindVariables.size(); i++) { 
     // variables are indexed from 1 in JDBC 
     ps.setString(i+1, bindVariables.get(i)); 
    } 
    ResultSet rs = ps.executeQuery(); 

    // iterate over the result set here 

    rs.close(); 
} finally { 
    if (ps != null) { 
     ps.close(); 
    } 
} 

В коде есть некоторое дублирование, которое можно удалить, введя вспомогательный метод, если вы должны использовать больше столбцов в состоянии WHERE.

Смежные вопросы