Метод обновления MySQL в java работает некорректно

Я написал следующий метод UPDATE для своей базы данных MySQL.

public int update(User u) {

    int status = 0;
    Connection connection = null;
    PreparedStatement stm = null;

    try {
        connection = ConnectionConfiguration.getConnection();
        stm = connection.prepareStatement("UPDATE users SET f_name=? 
              l_name=? WHERE id=?");

        stm.setString(1, u.getName());
        stm.setString(2, u.getLname());
        stm.setInt(3, u.getId());

        status = stm.executeUpdate();

    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        if (stm != null) {
            try {
                stm.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    } return status;

}

Затем я обновляю данные в классе JSP, как показано ниже:

<% int id =Integer.parseInt(request.getParameter("Userid")); 
   UserM um = new UserM(); 
   User u = new User();
   u = um.select(id);
%>
<form method = "GET" action = "EditServlet">
<input type = "hidden" name = "id" value = "<%=u.getId()%>">
Name:<input type = "text" name = "fname" value = "<%=u.getName()%>"><br>
Last name:<input type = "text" name = "lname" value = "<%=u.getLname()%>"><br>

<input type = "submit" value = "Edit">
</form>

В EditServlet я написал следующий код.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String rid=request.getParameter("id");  
    int id=Integer.parseInt(rid);  
    String fname =request.getParameter("fname");  
    String lname=request.getParameter("lname");  


    User u =new User();  
    u.setName(fname);  
    u.setLname(lname); 
    u.setId(id);
    UserM um = new UserM(); 
    int up_status = um.update(u);  

    if (up_status > 0) {

        request.getRequestDispatcher("/GetUserInfo").forward(request, response); 
    } else {  
        request.setAttribute("errorMessage", "Could not change info");
        request.getRequestDispatcher("/GetUserInfo").forward(request, response);  
    }

}  

После запуска кода и обновления данных он каждый раз показывает сообщение об ошибке. Что-то не так с реализацией моего кода?

он показывает сообщение об ошибке каждый раз - а что это за ошибка? Также в update что такое res?
Scary Wombat 31.10.2018 00:54

это сообщение об ошибке, которое я указал с помощью request.setAttribute ("errorMessage", "Не удалось изменить информацию"); Это все, что он делает. Не обновляет никаких данных

user10479159 31.10.2018 00:56

Нет, не показывает никаких исключений

user10479159 31.10.2018 01:02
Несвязанный: Используйте попробуйте с ресурсами, чтобы устранить всю эту странную (и нестабильную) логику close().
Andreas 31.10.2018 01:17

Также почему вы выполняете часть select в JSP? Вы уверены, что запись получена? Почему вы делаете Get при отправке формы? Пора заняться отладкой

Scary Wombat 31.10.2018 01:22

Я сделал выбор в JSP bc. Мне нужно показать данные в форме, и да, запись получена. Также при публикации сообщения об ошибке я добавил методы получения для пользователя, и он отображает новые значения, которые я ввожу, но просто не обновляет их в БД.

user10479159 31.10.2018 01:24

Я решил это. В моем обновлении SQL произошла ошибка

user10479159 31.10.2018 01:38

Не могли бы вы добавить к своему вопросу, что вы сделали, чтобы этот вопрос мог быть полезен другим людям в будущем.

Scary Wombat 31.10.2018 01:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
8
127
2

Ответы 2

В этом коде

User u =new User();  
u.setName(fname);  
u.setLname(lname);

вы не устанавливаете значение User::id, поэтому, когда вы собираетесь использовать его в update(User u), значение будет равно нулю.

изменить на

User u =new User();  
u.setName(fname);  
u.setLname(lname);
u.setId (id);

Извините за ошибку. На самом деле это есть в моем коде. Я, должно быть, забыл написать это здесь.

user10479159 31.10.2018 01:14

Что ж, в этом случае может показаться, что у вас нет пользователя в вашей БД с этим id

Scary Wombat 31.10.2018 01:15

ну, я проверил свою БД, и есть пользователь с данным идентификатором, поэтому я не знаю, в чем проблема.

user10479159 31.10.2018 01:21

Проблема была с моим оператором SQL. Я забыл запятую после f_name. Должно было быть: "ОБНОВЛЕНИЕ пользователей SET f_name = ?, l_name =? WHERE id =?"

В первой версии вашего вопроса был , - как мы можем успешно ответить?

Scary Wombat 31.10.2018 01:58

это было потому, что когда я написал это здесь, я поместил это и в моем исходном коде я забыл это

user10479159 31.10.2018 02:32

Другие вопросы по теме