无法从JSF编辑数据库行

时间:2013-10-25 21:50:26

标签: jsf

大家好我在JSF中有一个数据表,它显示了我的数据库表的所有内容,它显示得很好,我还有一个删除功能,可以成功地从数据库中删除并更新数据表,但是当我尝试更新数据库我得到错误

java.lang.IllegalArgumentException: Cannot convert richard.test.User@129d62a7 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();
                }
            }
        }
    }

我只是想编辑上面的代码,以便更新记录而不是删除它们,所以我编辑它看起来像:

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>

目前当您按下编辑按钮时,它只会使用与我尚未设法获得的数据库相同的值来更新它,以便数据库可以使用数据库进行编辑,我已经看到了一些带数组列表的数据示例table从中获取它的值但从来没有数据库,所以如果你对此有任何建议也会很好

感谢

1 个答案:

答案 0 :(得分:5)

错误非常明确:

  

无法将richard.test.User类型的richard.test.User@129d62a7转换为long

edit方法收到long时,您正在发送用户对象。这在此处注明。

JSF代码:

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

Java代码:

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

解决方案:

  1. 更改JSF代码,以便在delete方法中发送用户ID:

    <h:commandButton value="Delete" action="#{user.delete(u.userID)}" />
    
  2. 更改Java代码以在Java方法中接收用户作为参数:

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

  3. 您当前的代码存在其他问题:

    • 您可以手动打开和关闭连接。在现实世界的应用程序中,这是绝不能。相反,您应该使用数据库连接池。有几种方法可以实现此目的,您可以选择在应用程序服务器中将其创建为JNDI资源,或使用处理此问题的第三方库。
    • 你没有使用PreparedStatement的全部力量。您是通过连接值来创建查询,而您应该使用参数,使用?来设置参数(这是PreparedStatement的主要目的)。< / LI>

    更多信息: