Динамический SQL-запрос в Java

0

У меня есть функция

public void executeMyQuery( Connection con) {
PreparedStatement ps = con.prepareStatement(SELECT *FROM STUDENT WHERE ID = ?);
ps.setInt(1, 7);
ps.executeQuery();}

если я запустил это, он будет работать нормально. Но я хочу сделать так.

  1. если я укажу, что он должен включать предложение WHERE. (возвращает согласованную строку)
  2. если я не setInt, он должен исключать предложение WHERE. (возвращает всю таблицу)

Или существует какой-либо способ динамического удаления или изменения строки после предложения WHERE.

Теги:
sql-server

3 ответа

0
Лучший ответ

Вы должны создать свой запрос динамически, в начале метода проверки id является null или равным 0. Чтобы было проще, вы можете использовать трюк в where where с 1=1 так что предложение where может быть включено все время в запросе.

public void executeMyQuery( Connection con, Integer id) {
String query = "SELECT *FROM STUDENT WHERE 1=1";
if(id != null){
   query += "AND ID = ?";
}
PreparedStatement ps = con.prepareStatement(query);

if(id != null){
   ps.setInt(1, id);
}
ps.executeQuery();}
0

В вашей программе могут быть два параметра PreparedStatements - один без WHERE ID =? и другой с ним.

Кроме того, вы должны сохранить свои PreparedStatements и повторно использовать, чтобы лучше хранить их как поле и т.д.

И тогда, когда вам нужно получить данные, вызовите либо первый подготовленный оператор, либо второй.

  • 0
    Я бы использовал две String но одну PreparedStatement , нет необходимости создавать две, если одна не будет использоваться;)
-3

Майкл Дз близок к решению в своем ответе, но в коде есть проблема: он называет setInt не существующим подготовленнымСтатом.

Попробуйте что-то вроде этого:

public void executeMyQuery( Connection con, int Id) {
    StringBuffer sql = new StringBuffer();
    sql.append("Select * FROM STUDENT");
    if(Id > -1) {
        sql.append(" Where ID = ?");
    }
    preparedStatement ps = con.prepareStatement(sql.toString());
    if(ID > -1) {
        ps.setInt(1, Id);
    }
    ps.executeQuery();   // You might want to catch the result of the query as well
}

Надеюсь это поможет !

  • 0
    Спасибо за указание.
  • 0
    Вы не должны воссоздавать PreparedStatements с каждым вызовом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню