Консультация № 186849
21.11.2012, 11:05
100.51 руб.
0 3 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Есть гуи форма с несколькими полями для ввода данных. Всё что нужно сделать, это принять введённые пользователем данные и подставить их в SQL-запрос. То есть нажимая на кнопку "Отправить", создаётся массив hashmap куда вносится пара: "ключ-значение"
Код:

String query = "select * from users where";
HashMap<String, String> hash = new HashMap <String, String>();
hash.put ("name =", jTextField1.getText ());
hash.put ("age =", jTextField2.getText ());
hash.put ("phone = ", jTextField3.getText ());


Далее мы должны проверить, если текстовое поле не пусто, то подставить данную пару значений (имя столбца и параметр) в запрос, а если введены данные в два и более полей то подставлять соответственно эти пары добавляя в запрос "AND". Подскажите пожалуйста, как это реализовать в коде.

Обсуждение

давно
Старший Модератор
312929
1973
29.11.2012, 09:51
общий
это ответ
Здравствуйте, Слава!

Попробуйте что-нибудь в таком роде:
[code lang=js]
var a = [];
for (Map.Entry<String, String> entry: hash.entrySet())
if (entry.getValue() != "") push(a, entry.getKey() + entry.getValue());
query = query + a.join(" AND ");
[/code]
За точность кода не ручаюсь (ибо в Java не силён), если будут вопросы - спрашивайте в минифоруме.
Неизвестный
29.11.2012, 14:53
общий
Спасибо за ответ! Правда за ту неделю, что вопрос был опубликован я эту задачу - решил, кроме одного момента.
Используя таблицы HashMap введёные в jTextField1 значения сохраняются без ковычек и соответственно сфоримированный sql-запрос при отправке на сервер возвращает ошибку. Подскажите пожалуйста, можно ли реализовать что то вроде этого:

//Проверяем если текстовое поле не пусто
if (jTextField1.getText().length() > 0)
//то заключаем введённое значение в одиночные ковычки и загружаем в хэшпут
{
hash.put ("name ", jTextField1.getText ());
}
Неизвестный
30.11.2012, 10:12
общий
30.11.2012, 10:25
Добрый день, Слава!

Вам необходимо использовать PreparedStatement для формирования вашего запроса и обработки его результат.

Документацию можно почитать здесь:
Java api PreparedStatement
PreparedStatement Tutorial

Если вкратце, то в ваш запрос, на месте параметров необходимо проставить знаки вопроса и далее с помощью методов .set заполнить их необходимыми значениями.

В результате можно отказаться от использования карты.

Пример:

[code lang=js]// Чтение параметров из формы.
String name = jTextField1.getText();
int age;
try {
age = Integer.parseInt(jTextField2.getText());
} catch(NumberFormatException e) {
// Не верно задан возраст
// таким образом можно организовать дополнительную проверку
// правильности введенных значений
return;
}
String phone = jTextField3.getText();

Connection con = null;
PreparedStatement stmt = null;
ResultSet res = null;
List<String> names = null;

try {
if(con == null) {
Class.forName(dbDriver);
con = DriverManager.getConnection(dbUrl, user, password);
}

stmt = con.prepareStatement("select name from users where name=? and age=? and phone=?");

// Устанавливаем имя
stmt.setString(1, name);
// Устанавливаем возраст
stmt.setInt(2, age);
// Устанавливаем телефон
stmt.setString(3, phone);

res = stmt.executeQuery();

while(res.next()) {
if(names == null) {
names = new ArrayList<String>();
}
// Сохраняем результат в список
names.add(res.getString(1));
}
} catch (ClassNotFoundException e) {
// Ошибка, не найден драйвер базы данных
} finally {
// По окончанию работы с базой данных необходимо освободить все ресурсы и закрыть соединение
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
// Ошибка при освобождении ресурсов
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
// Ошибка при закрытии соединения
}
}
}
// Возвращаем результат выполнения запроса (список имен)
return names;[/code]
Форма ответа