Вывод конкретных данных из БД

 
 
 
Сообщения:1
Добрый вечер, я пишу телеграмм бота который возвращает данные из БД при соответствующих запросах. Сейчас при написании боту "/database" он выводит те данные которые я прописал в sql запросе.
 case "/database":
                    BaseConnection worker = new BaseConnection();           //подключаем БД

                    String qwery = "select * from users where  name ='Alex' and id = 4"; 
                    try{
                        Statement statement = worker.getConnection().createStatement();
                        ResultSet resultSet = statement.executeQuery(qwery);

                        while (resultSet.next()) {


                           users.setId(resultSet.getInt("id"));
                          users.setName(resultSet.getString("name"));
                            users.setAge(resultSet.getInt("age"));
                            users.setEmail(resultSet.getString("email"));
                            sendMsg(message, String.valueOf(users));
                        }
                    }catch (SQLException e){
                        sendMsg(message, "Error");
                    }


Хотелось бы сделать это более гибким, чтоб при вводе сообщения можно было изменять сам запрос. Например сообщение которое мы вводим боту(message) можно вставить в сам запрос sql("select * from users where name =" + message), но тогда начать работу кода выше не получиться, либо делать его восприимчивым к любому сообщению. Подскажите как это реализовать.
 
 
Сообщения:4
Я бы попробовал сначала узнать существует ли такое имя в базе данных
boolean isUserExists(String name) {
      boolean isUserExists = false;
            try (PreparedStatement ps = conn.prepareStatement("select * from users where name = ?")) {
                ps.setString(1, name);
                try (ResultSet rs = ps.executeQuery()) {
                    if (rs.next()) {
                        isUserExists = true;
                    } 
                }
            }
      return isUserExists;
}
Изменен:08 мая 2019 05:17
 
 
Сообщения:4
String qwery = "select * from users where  name ='Alex' and id = 4"

Имя должно быть уникальным? Если да, то достаточно будет узнавать данные по имени. Либо при проверке можно узнать id и прописать только его.
Изменен:08 мая 2019 05:25
 
 
Сообщения:4
Я не слишком, конечно разбираюсь) Если меня поправят буду рад)
 
 
Сообщения:255
Volski:
но тогда начать работу кода выше не получиться, либо делать его восприимчивым к любому сообщению


Напрашивается какой-то механизм парсинга сообщений. Сообщения, например, можно сделать в виде "/<команда> <параметр>".

Использование switch-case не самый хороший вариант для обработки команд.
Можно использовать паттерн "Команда" и хранить их в мапе или фабрику сделать.

"Мы же профессионалы! Мы всегда делаем чуть больше, чем требуется!" (с)
 
 
Сообщения:605
Volski:
Например сообщение которое мы вводим боту(message) можно вставить в сам запрос sql("select * from users where name =" + message)


На всякий случай, заранее соломки накидываю: если будете данные от пользователя в запрос добавлять, то используйте PreparedStatement, чтобы защититься от SQL-инъекций.
 
 
Сообщения:605
runjoy:
try (PreparedStatement ps = conn.prepareStatement("select * from users where name = ?")) {


В данном случае, нет смысла выбирать из БД все поля, если вы их не используете (меньше передавать по сети, меньше памяти потребуется). Я был сделал через SELECT COUNT(*) и смотрел 0 или >0 вернулось в результате.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет