大家好我在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从中获取它的值但从来没有数据库,所以如果你对此有任何建议也会很好
感谢
答案 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) {
//...
}
解决方案:
更改JSF代码,以便在delete
方法中发送用户ID:
<h:commandButton value="Delete" action="#{user.delete(u.userID)}" />
更改Java代码以在Java方法中接收用户作为参数:
public void editData(User user) {
//...
}
您当前的代码存在其他问题:
PreparedStatement
的全部力量。您是通过连接值来创建查询,而您应该使用参数,使用?
来设置参数(这是PreparedStatement
的主要目的)。< / LI>
更多信息: