2013-10-25 2 views
0

Привет, ребята, у меня есть таблица данных в JSF, которая отображает все содержимое моей таблицы базы данных, она отображает ее в порядке, у меня также есть функция удаления, которая может успешно удалить из базы данных в порядке и обновляет таблицу данных штраф, однако, когда я пытаюсь обновить базу данных я получаю ошибкуНевозможно отредактировать строку базы данных из JSF

java.lang.IllegalArgumentException: Cannot convert [email protected] of type class richard.test.User to long 

ниже код, который я использую, чтобы удалить строки в базе данных, которая работает отлично:

public void delete(long userID) { 
     PreparedStatement ps = null; 
     Connection con = null; 
     if (userID != 0) { 
      try { 
       Class.forName("com.mysql.jdbc.Driver"); 
       con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); 
       String sql = "DELETE FROM user1 WHERE userId=" + userID; 
       ps = con.prepareStatement(sql); 
       int i = ps.executeUpdate(); 
       if (i > 0) { 
        System.out.println("Row deleted successfully"); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        con.close(); 
        ps.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

Я просто хотел отредактировать приведенный выше код, чтобы он обновлял re Шнуры вместо их удаления, так что я редактировал его выглядеть следующим образом:

public void editData(long userID) { 
     PreparedStatement ps = null; 
     Connection con = null; 
     if (userID != 0) { 
      try { 
       Class.forName("com.mysql.jdbc.Driver"); 
       con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); 
       String sql = "UPDATE user1 set name = '"+name+"', email = '"+ email +"', address = '"+address+"' WHERE userId=" + userID; 
       ps = con.prepareStatement(sql); 
       int i = ps.executeUpdate(); 
       if (i > 0) { 
        System.out.println("Row updated successfully"); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        con.close(); 
        ps.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

и XHMTL является:

  <p:dataTable id="dataTable" var="u" value="#{userBean.getUserList()}" 
         paginator="true" rows="10" 
         editable="true" 
         paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
         rowsPerPageTemplate="5,10,15"> 



       <p:column> 

        <f:facet name="header"> 
         User ID 
        </f:facet> 
        #{u.userID} 

       </p:column> 

       <p:column> 
        <f:facet name="header"> 
         Name 
        </f:facet> 
        #{u.name} 
       </p:column> 

       <p:column> 
        <f:facet name="header"> 
         Email 
        </f:facet> 
        #{u.email} 
       </p:column> 
       <p:column> 
        <f:facet name="header"> 
         Address 
        </f:facet> 
        #{u.address} 
       </p:column> 

       <p:column> 
        <f:facet name="header"> 
         Created Date 
        </f:facet> 
        #{u.created_date} 
       </p:column> 

       <p:column> 
        <f:facet name="header"> 
         Delete 
        </f:facet> 
        <h:commandButton value="Delete" action="#{user.delete(u.userID)}" /> 
       </p:column> 
       <p:column> 
        <f:facet name="header"> 
         Delete 
        </f:facet> 
        <h:commandButton value="Edit" action="#{user.editData(u)}" /> 
       </p:column> 

В настоящее время при нажатии кнопки редактирования будет только обновить его с теми же значениями, как я еще не удалось получить доступ к данным для редактирования с помощью базы данных, я видел несколько примеров с массивом, в котором таблица данных получает свои значения, но никогда не является базой данных, поэтому, если у вас есть какие-либо советы по этому поводу, отличное

спасибо

ответ

5

Ошибка очень четко:

Невозможно преобразовать [email protected] класса типа richard.test.User к длительному

Вы посылаете объект пользователя, когда ваш edit Метод получает long. Это отмечено здесь.

JSF код:

<h:commandButton value="Edit" action="#{user.editData(u)}" /> 

Java код:

public void editData(long userID) { 
    //... 
} 

Решения:

  1. Изменить для JSF код, чтобы отправить идентификатор пользователя, как вы делаете это в методе delete :

    <h:commandButton value="Delete" action="#{user.delete(u.userID)}" /> 
    
  2. Изменить код Java, чтобы получить пользователь в качестве параметра в методе Java:

    public void editData(User user) { 
        //... 
    } 
    

Есть и другие проблемы, связанные с текущем кодом:

  • Открывает и закройте соединение вручную. Это не должно в реальных приложениях. Вместо этого для этого необходимо использовать пул соединений с базой данных. Это можно сделать несколькими способами, вы можете создать его как ресурс JNDI на своем сервере приложений или использовать стороннюю библиотеку, которая обрабатывает это.
  • Вы не используете всю мощность PreparedStatement. Вы создаете запрос, объединяя значения, в то время как вы должны использовать параметры, те вещи, которые используют ?, где вы хотите установить параметр (который является основной целью PreparedStatement).

Подробнее:

+0

Большое спасибо, что зафиксировал его жаль, что быть просто ошибка его был длинный день! – user1924104

+0

@ user1924104 обратите внимание на мое обновление ответа, включает некоторые советы для вашего текущего подхода –

+0

Хорошо спасибо, я подробно рассмотрю их завтра – user1924104

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