【问题标题】:What is the correct way of using preparedStatements in Java to send data to a MySQL database?在 Java 中使用preparedStatements 将数据发送到MySQL 数据库的正确方法是什么?
【发布时间】:2013-08-27 05:06:57
【问题描述】:

我想将字符串“格列佛游记”从 java 应用程序发送到 sql 数据库。我尝试使用preparedStatements,但失败了。我怎样才能做到这一点? 这是我的代码。

private int setData(Connection conn,Object[] data){
     String sql = "INSERT INTO book VALUES(?,?)";
     PreparedStatement prepStm = conn.prepareStatement(sql);
     prepStm.setObject(1,data[0]);
     prepStm.setObject(2,data[1]);
     return prepStm.executeUpdate();
}

表格列:

    bookName : VARCHAR
    bookPrice : INT

错误: SQL 语法错误。将名称字段添加到数据库失败

【问题讨论】:

  • book 中有哪些列?它们是什么类型的?
  • bookName - VARCHAR bookPrice - VARCHAR 给出 SQL 语法错误。 bookName 列未填充。
  • 别忘了关闭PreparedStatement

标签: java mysql jdbc prepared-statement


【解决方案1】:

如果你的列类型在实际数据库表中是VARCHAR,那么使用

 prepStm.setString(1,"Gulliver's Travels");

而不是

 prepStm.setObject(1,"Gulliver's Travels");

按照本教程了解有关 PreparedStatement 及其用法的更多信息。

http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

【讨论】:

    【解决方案2】:

    试试这个 这是针对更新的问题

    private int setData(Connection conn,Object[] data){
         String sql = "INSERT INTO book VALUES(?,?)";
         PreparedStatement prepStm = conn.prepareStatement(sql);
         prepStm.setString(1,"Gulliver's Travels");
         prepStm.setInt(2,200);
         return prepStm.executeUpdate();
    }
    

    【讨论】:

    • 等等。我会尝试..顺便说一句,谁能告诉我为什么我的问题被否决了?
    • @isuru-buddhika 通过提供更多信息来改进您的问题。请参阅您问题中的 cmets。许多用户想要更多详细信息
    • 感谢您指出。我实际上没想到表格列会成为问题。顺便说一句,为什么我不能使用 prepStm.setObject ?
    • @isuru-buddhika 表列也很重要,因为当您使用命令行插入时,您将 insert 写入表名 values(1,'string') 意味着如果该列是 varchar,那么您通过在 '' 中。你也必须在 JDBC 中做同样的事情
    • 我现在明白了。所以如果我使用 setObject 它想要正常工作是这样吗?
    【解决方案3】:

    设置一个对象不是你应该做的。当您知道输入的数据类型以及数据库列的数据类型时,请使用正确的 setter 方法。

    private int setData(Connection conn,Object[] data){
         String sql = "INSERT INTO book VALUES(?,?)";
         PreparedStatement prepStm = conn.prepareStatement(sql);
         prepStm.setString(1,"Gulliver's Travels");
         prepStm.setFloat(2,200.00);
         return prepStm.executeUpdate();
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2023-04-07
      • 2019-12-10
      • 1970-01-01
      • 2013-07-19
      相关资源
      最近更新 更多