无法从JSF编辑数据库行

use*_*104 0 jsf

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

java.lang.IllegalArgumentException: Cannot convert richard.test.User@129d62a7 of type class richard.test.User to long
Run Code Online (Sandbox Code Playgroud)

下面是我用来删除数据库中正常工作的行的代码:

  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();
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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();
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

而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>
Run Code Online (Sandbox Code Playgroud)

当你按下编辑按钮时,它只会使用与我尚未设法使用数据库可以编辑的数据相同的值更新它,我已经看到了一些数据表获取其数据列表的示例价值来自但绝不是数据库,所以如果你对此有任何建议也会很棒

谢谢

Lui*_*oza 5

错误非常明确:

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

您在edit方法收到时发送用户对象long.这是在这里注意到的.

JSF代码:

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

Java代码:

public void editData(long userID) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

解决方案:

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

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

    public void editData(User user) {
        //...
    }
    
    Run Code Online (Sandbox Code Playgroud)

您当前的代码还有其他问题:

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

更多信息: