1

我有一个包含字段的表订单oid odate ddate ShippingAddr Email

, whereoid是自动递增的,我正在使用以下查询-

"INSERT INTO order (Odate,Ddate, ShippingAddr, Email) 
 VALUES ('" + o.getOdate() + "','" + o.getDdate() + "','" + o.getShippingAddr() + "','" + Email + "')";

但它提供了Mysqlexception帮助

4

2 回答 2

1

根本不要像这样构建你的 SQL。而是使用参数化SQL,并设置各种参数值。

// You still need to escape the "order" table name as per Özkan's answer
String sql = 
   "INSERT INTO `order` (ODate, DDate, ShippingAddr, Email) VALUES (?, ?, ?, ?)";
try (PreparedStatement pst = conn.prepareStatement(sql))
{
    pst.setDate(1, o.getOdate());
    pst.setDate(2, o.getDdate());
    pst.setString(3, o.getShippingAddr());
    pst.setString(4, Email);
    pst.executeUpdate();
}

这将:

  • 避免SQL 注入攻击
  • 当问题出在 SQL 和数据上时更清楚(您问题中的 SQL 问题实际上与日期无关,但他们最终混淆了问题)
  • 将代码与数据分开
  • 避免日期等的转换问题

请注意,我使用setDateODateandDDate值。我希望它们是您数据库中的“日期”类型(或类似的东西),并且o.getODate()返回一个Date- 或者可能是一个 Joda Time 类型,例如LocalDate. 如果您实际上只是对数据模型中的所有内容使用字符串,那是另一件需要修复的事情(紧急,IMO)。

于 2013-08-14T05:58:57.850 回答
-1

首先,您的查询容易受到 SQL 注入的攻击。所以我建议你使用准备好的语句。

order是 SQL 的保留字。对于 MySQL 如果要将保留字用作表名或字段名,则应引用保留字

Connection c= null;
PreparedStatement ps= null;

c = setTheDBConnection(); //just for example

ps = c.preparedStatement("INSERT INTO `order` (Odate,Ddate,ShippingAddr,Email) VALUES (?,?,?,?)");

ps.setString(1, o.getOdate());
ps.setString(2, o.getDdate());
ps.setString(3, o.getShippingAddr());
ps.setString(4, Email);

ps.executeUpdate();
于 2013-08-14T05:51:16.930 回答