2011-02-01 4 views
0

Я использую следующий код для генерации результатов поиска из реляционной БД в зависимости от нескольких (необязательных) параметров поиска от веб-клиента.Java/JDBC - Поиск по нескольким параметрам Поиск по сайту

В настоящее время я использую «java.sql.Statement» для достижения функциональности, но мне нужно то же самое, что и с помощью «java.sql.PreparedStatement», чтобы предотвратить инъекции SQL.

Позвольте мне знать лучшие практики, чтобы изменить код


Э.Г.

Пользовательские входы от веб-клиента.

  • param1 - Дополнительный
  • param2 - Дополнительный
  • dateParamFr - Дополнительный
  • dateParamTo - Дополнительный

Псевдо код шаблонов SQL в зависимости от параметров поиска следующим

IF (WITHOUT ANY SEARCH PARAMETER){ 
    SELECT * FROM TEST_TABLE; 
} 
ELSE IF(WITH param1){ 
    SELECT * FROM TEST_TABLE WHERE COLUMN1= param1; 
} 
ELSE IF(WITH param1 & param2){ 
    SELECT * FROM TEST_TABLE WHERE COLUMN1= param1 AND COLUMN2= param2 
} 
SO ON 
……… 

фрагмент Java кода в моем EJB

/* 
     NOTE : Hashtable pSearchParam is a method parameter 
    */ 

    Connection cnBOP   = null; 
    Statement stmt    = null; 
    StringBuffer sb    = new StringBuffer("");   

    try { 
     cnBOP = jdbcBOP.getConnection(); // DataSource jdbcBOP 
     stmt = cnBOP.createStatement(); 

     /* ######################## SQL BODY ######################################*/ 
     sb.append("SELECT COLUMN1, COLUMN2, DATE_COLUMN "); 
     sb.append("FROM TEST_TABLE "); 

     /* ######################## SQL WHERE CLAUSE ##############################*/ 
     if(pSearchParam.size()>=1){ 
      sb.append("WHERE "); 
      Enumeration e = pSearchParam.keys(); 
      int count =0; 

      while(e.hasMoreElements()){ 
       if (count >=1) sb.append("AND "); 

       String sKey = (String) e.nextElement(); 

       if (sKey.equals("param1"))    sb.append ("COLUMN1 ='"+pSearchParam.get(sKey)+"' "); 
       else if (sKey.equals("param1"))   sb.append ("COLUMN2 ='"+pSearchParam.get(sKey)+"' ");     
       else if (sKey.equals("dateParamFr")) sb.append ("DATE_COLUMN >= TO_DATE('"+pSearchParam.get(sKey)+" 00:00:00','DD/MM/YYYY HH24:MI:SS') "); 
       else if (sKey.equals("dateParamTo")) sb.append ("DATE_COLUMN <= TO_DATE('"+pSearchParam.get(sKey)+" 23:59:59','DD/MM/YYYY HH24:MI:SS') "); 

       count ++; 
      } 
     } 
     /* ######################## SQL ORDER BY CLAUSE ############################*/ 
     sb.append("ORDER BY DATE_COLUMN DESC"); 

     ResultSet rs = stmt.executeQuery(sb.toString()); 

ответ

0

Это действительно похоже на работу для Hibernate Criteria Queries ...

Критерии является упрощенным API для получения объектов путем составления объектов Criterion. Это очень удобный подход для функциональности как «поисковые» экраны, где есть переменное количество условий, которое должно быть , помещенное на результирующий набор.

+1

он использует простой JDBC, я думаю, –

0

Вы используете Hibernate? Затем вы можете использовать criteria API. Else for non hibernate вы можете взглянуть на инструмент SqlBuilder для генерации SQL-запросов на основе условий.

Также вы должны использовать маркеры "?" вместо фактических значений.

Так что этот запрос должен быть таким.

SELECT * FROM TEST_TABLE WHERE COLUMN1= ?; 

Вы можете использовать PreparedStatements, чтобы установить значения для этого столбца. Вводным руководством по использованию PreparedStatement является here.

+0

тег и код, который он использует, просто jdbc –

1

Положитесь на вашем двигателе базы данных Вы можете использовать функции SQL как

isnull(value,valueIfNull) 

, например, в MSSQL

select * from Order where storeId = isnull(?,storeId) 

рядом с вами Java код

preparedStatement.setNull(1,java.sql.Types.INTEGER) 

, если вам нужно пропустить это параметр из фильтра или,

preparedStatement.setInt(1,20) 

, если вам нужно найти все заказы с StoreID = 20

4

Вместо

sb.append ("COLUMN1 ='"+pSearchParam.get("param1")+"' "); 

Вы должны будете сделать

sb.append ("COLUMN1 = ? "); 

, а затем после того, как вы создаете заявление вы делаете

stmt.setString(1, pSearchParam.get("param1")); 

Это только для первого параметра, вы должны сделать это для всех операторов и перечислить индекс в

setString(int index, String param); 

Обратите внимание, что вам нужно будет использовать другие методы для междунар, длинные, Дата ... и т.д.

+0

Хороший ответ, но помните, что индексы JDBC основаны на 1, а не на 0. –

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