Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Don';如果之前有数据,则不更新_Java_Mysql_Prepared Statement - Fatal编程技术网

Java Don';如果之前有数据,则不更新

Java Don';如果之前有数据,则不更新,java,mysql,prepared-statement,Java,Mysql,Prepared Statement,我有如下表格 ++++++++++++++++++++++++++++++++++++++++++++++++++ + Id : TextBox + + Name : TextBox + + Mob : TextBox + + Photo : File Option

我有如下表格

++++++++++++++++++++++++++++++++++++++++++++++++++
+   Id     :  TextBox                            +
+   Name   :  TextBox                            +
+   Mob    :  TextBox                            +
+   Photo  :  File Option                        +
+                                                +
+   Submit   Update                              +
++++++++++++++++++++++++++++++++++++++++++++++++++
PreparedStatement pst = conn.prepareStatement("UPDATE myTable SET name=?, mob=?, photo=? WHERE id=?");
pst.setString(1, personName);
pst.setString(2, mobileNum);
pst.setBinaryStream(3, InputStreamData);
pst.setString(4, personId);
pst.executeUpdate();
pst.setBinaryStream(4, rst.getBinaryStream(1));
我想做的是更新相应Id的数据。对于更新,我有如下查询

++++++++++++++++++++++++++++++++++++++++++++++++++
+   Id     :  TextBox                            +
+   Name   :  TextBox                            +
+   Mob    :  TextBox                            +
+   Photo  :  File Option                        +
+                                                +
+   Submit   Update                              +
++++++++++++++++++++++++++++++++++++++++++++++++++
PreparedStatement pst = conn.prepareStatement("UPDATE myTable SET name=?, mob=?, photo=? WHERE id=?");
pst.setString(1, personName);
pst.setString(2, mobileNum);
pst.setBinaryStream(3, InputStreamData);
pst.setString(4, personId);
pst.executeUpdate();
pst.setBinaryStream(4, rst.getBinaryStream(1));
我有问题。我将用情景来解释。

假设id为1,并且我已经有personName和file的数据。现在我只输入手机号码。如何避免pst.setBinaryStream(4,InputStreamData)语句?我不想输入任何数据,因为数据已经存在。是否存在可以插入数据的sql语句

我只能预填充名称数据,但不能预填充文件数据

编辑1 解决方案是,有许多更新语句。但问题是我有很多领域。我不能用这么多更新语句

编辑2 我尝试的是读取照片数据并在setBinaryStream中设置该数据,如下所示

++++++++++++++++++++++++++++++++++++++++++++++++++
+   Id     :  TextBox                            +
+   Name   :  TextBox                            +
+   Mob    :  TextBox                            +
+   Photo  :  File Option                        +
+                                                +
+   Submit   Update                              +
++++++++++++++++++++++++++++++++++++++++++++++++++
PreparedStatement pst = conn.prepareStatement("UPDATE myTable SET name=?, mob=?, photo=? WHERE id=?");
pst.setString(1, personName);
pst.setString(2, mobileNum);
pst.setBinaryStream(3, InputStreamData);
pst.setString(4, personId);
pst.executeUpdate();
pst.setBinaryStream(4, rst.getBinaryStream(1));
但它给了我一个错误

java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;)V

javax.faces.el.EvaluationException: java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;)V
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
--


当用户使用表单编辑其个人信息时,表单应预先显示其当前姓名和电话号码

这样,如果他只更改了自己的电话号码,他将不会触碰包含姓名的姓名输入字段,表单将与当前姓名和新电话号码一起提交。您可以更新数据库中的所有字段


这是一个用户界面问题,而不是数据库问题。

您可以使用两个更新语句。一个用于个人信息,另一个用于文件。后者仅在用户实际上传新照片时执行(通过web表单提交照片时很容易检查)


或者,您可以有两个更新语句,一个只更新个人信息,另一个更新个人信息和文件。与以前一样,后者将在用户实际上传新照片时执行。

编辑2中出现的错误是,该方法尚未实现

试试看

测试3正在传递流的长度,并且该方法似乎已实现


我假设您使用的是那些测试中使用的JDBC 3.0成功了

你试过@MahmoudGamal吗:我正在使用更新语句。。。不插入我正在填充数据。但问题是我有文件选项。我无法预填充数据。请使用专用表单单独更新照片,并使用另一个表单更新所有其他字段。请查看更新后的问题?我发布了我所面临的实际问题…实际上,我有很多文件类型的字段。。。因此,考虑一条语句而不是许多UPDATE语句……假设我有15个file选项,那么你想说有16条UPDATE语句??这是可行的,如果表中有列的编号命名方案(例如FILE1、FILE2等),你可以创建一个参数化方法,为特定列返回UPDATE语句。如果每个列名不同,也可以这样做(只需将列名作为参数传递给生成UPDATE语句的方法)。如果由于某种原因这也不起作用,我宁愿使用16个不同的update语句,而不是像您尝试的那样在DB中重新更新文件。它的效率很低。也许它能达到目的,但效率很低,有点难看。您将数据(大量数据)来回发送到数据库。