【问题标题】:Prepared statement in Java [duplicate]Java中的准备语句[重复]
【发布时间】:2018-07-23 05:37:41
【问题描述】:

我已经开始学习如何用 Java 编写语句。我在 Stack Overflow 上看到了具有值的预处理语句,但我想知道如何编写类似于我的语句的东西来成为一个预处理语句。 这是我的代码:

public void put(MySQLDatabase mysqlDB) {
    if (mysqlDB != null) {
      boolean bool = mysqlDB.setMySqLData("UPDATE Person SET personName = '" +
        personName +
        "', personDescr = '" + personDescr + "', personAge = " + personAge + "
        WHERE personId = " + personId);
    }
}

public void post(MySQLDatabase mysqlDB) {
  if (mysqlDB != null) {
    boolean bool = mysqlDB.setMySqLData("INSERT INTO person VALUES(" + personId +
      ", '" +
      personName + "', '" + personDescr + "', " + personAge +
      ")");
  }
}

public void delete(MySQLDatabase mysqlDB) {
  if (mysqlDB != null) {
    boolean bool = mysqlDB.setMySqLData("DELETE FROM person WHERE personId=" +
      personId);
  }
}

我不知道是否可以这样做,我想知道为这些查询做一个准备好的语句是否有任何好处。

【问题讨论】:

  • 你能正确缩进你的代码吗?
  • 对不起,这是我的第一篇文章,我不知道如何缩进它。在 netbeans 中它是缩进的。
  • 看看这个meta post,了解如何格式化代码块。
  • @MichealO'Dwyer 感谢您的链接:)
  • @VasilijZ 没问题。

标签: java mysql prepared-statement


【解决方案1】:
    // Creates a new connection
    Connection conn = DriverManager.getConnection(connectionUrl, user, password);

    // Prepares a PreparedStatement
    PreparedStatement prep = conn.prepareStatement("UPDATE Person SET personName = ?" +
            ", personDescr = ?, personAge = ? WHERE personId = ?");

    // Populate the statement with its parameters
    prep.setString(1, personName);
    prep.setString(2, personDescr);
    prep.setInt(3, personAge);
    prep.setLong(4, personId);

    // Execute the updates
    int numberOfRowsUpdated = prep.executeUpdate();

这需要您使用DriverManager.getConnection,这需要您注册 MySQL 驱动程序。这可能比直接使用 MySQL 在 OOP 方面更好,你必须依赖大多数抽象(依赖于接口,而不是具体实现)

【讨论】:

  • 如果你做了 4 条标准语句,然后在你要使用它们的每种方法中修改它们,我认为这将是一个完美的答案。
【解决方案2】:

我将在这里留下一个示例和文档,以便您开始,它非常简单,只需使用“?”添加占位符和正确的方法来完成从 1 开始的索引

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setInt(2, 110592)

https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html

【讨论】:

  • 如果我有可以使用的价值观?而不是查询,但如果我没有要插入的值(如 pstmt.setBigDecimal(1, 153833.00)),使用它们是否明智?如果我使用它们,我的代码会更快吗,还是应该像我一样做声明。
  • 最好不要直接使用值,根据经验,使用 ?和方法。这甚至也是一种网络安全实践。它可确保类型安全并简化您的逻辑,甚至减少对额外卫生设施的需求。
  • 您的代码在性能上可能甚至不会闪烁,与执行相比,组装此查询的速度非常快。尝试以这种方式压缩性能将是愚蠢的,如果您在这条路线上,您将在数据库本身中存储参数化查询,而对于这种简单的查询没有真正的改进。
  • @VasilijZ 没关系性能:您的代码容易受到SQL injection 的攻击(好吧,如果您的输入来自用户)
  • 没错,在这里更改为准备好的语句是双赢的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 2012-12-18
相关资源
最近更新 更多