mysql for java中的句子

我猜错误是在sentenciaSQL中,但我不知道如何解决它=

public long guardar(PedidoDTO obj) throws SQLException { PedidoDTO dto = new PedidoDTO(); String url="jdbc:mysql://127.0.0.1:3306/capacitacion?user=capacitacion&password=password"; try { Connection con = DriverManager.getConnection(url); String sentenciaSQL = "INSERT INTO capacitacion.pedido (id, fecha, total, folio) VALUES(NULL,'" + obj.getId() + "," + obj.getFecha() + ","+ obj.getTotal() + "," + obj.getFolio() + "')"; PreparedStatement s = con.prepareStatement(sentenciaSQL); s.executeUpdate(); for(PedidoDetalleDTO detalle:obj.getPedidoDetalle()){ dto.getId(); dto.getFecha(); dto.getTotal(); dto.getFolio(); }con.close(); } catch (SQLException e) { System.out.println(e); } return dto.getId(); } 

这对PreparedStatement来说不是一个好用法,它应该是这样的:

 String sentenciaSQL = "INSERT INTO capacitacion.pedido (id, fecha, total, folio) VALUES(?, ?, ?, ?)"; PreparedStatement s = con.prepareStatement(sentenciaSQL); s.setInt(1, obj.getId()); s.setDate(2, obj.getFecha()); s.setDouble(3, obj.getTotal()); s.setString(4, obj.getFolio()); 

顺便问一下,为什么要使用这个块代码:

 for(PedidoDetalleDTO detalle:obj.getPedidoDetalle()){ dto.getId(); dto.getFecha(); dto.getTotal(); dto.getFolio(); } 

看起来您想要使用相同的方法在表中添加订单详细信息(detalles de la orden / pedido),但不会以这种方式工作。 如果您发布function要求以帮助您解决实际问题,那将是一件好事。

仔细看。 你犯的错误是你在sentenciaSQL中的第一个和最后一个变量都有单独的,未闭合的刻度标记(在ID和作品集上):

 VALUES(NULL,'" + obj.getId() 

和…

 obj.getFolio() + "')"; 

由于您已经在使用预准备语句,因此最好的方法是将您的值添加为参数,如下所示:

 String sentenciaSQL = "INSERT INTO capacitacion.pedido (id, fecha, total, folio) VALUES(?,?,?,?)"; PreparedStatement s = con.prepareStatement(sentenciaSQL); s.setInt(1,obj.getId()); s.setDate(2,obj.getFecha()); s.setInt(3,obj.getTotal()); s.setString(4,obj.getFolio().toString()); s.execute(); 

请注意,我假设您的Id和Total是整数。 您将希望用实际数据类型替换。

此外,如果您不关心已更新的行数,则可以使用execute()而不是executeUpdate()。 任何一个都没问题。

您正尝试将五个数据插入四个字段。 您的查询将尝试将NULL插入idobj.getId()fecha等等。看起来像删除值列表中的NULL将是一个很好的第一步。