【问题标题】:java jdbc check if value exists before inserting into tablejava jdbc在插入表之前检查值是否存在
【发布时间】:2019-05-12 23:57:27
【问题描述】:

我正在处理一个 Java 项目,但在将值插入表中时遇到了困难。我想在插入此表之前进行检查,看看是否有任何重复。

之后我尝试了一个带有结果集的 executeUpdate 用于执行查询,但我收到“java.sql.SQLException:无法使用 executeQuery() 发出数据操作语句。”

这是我正在使用的代码,在此先感谢您!

    public void registernow(ActionEvent actionEvent) throws IOException, SQLException {
    ConnectionClass registerClass = new ConnectionClass();
    Connection register = registerClass.getConnection();

    try {
        Statement registerStatement = register.createStatement();
        String sql = "INSERT INTO userAuth (username, password) VALUES ('" + txt_username.getText() + "' , '" + txt_password.getText() + "')";
        registerStatement.executeUpdate(sql);

        ResultSet resultSet = registerStatement.executeQuery(sql);

        if (resultSet.next()) {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("register.fxml"));
            Parent fxmlregister = (Parent) fxmlLoader.load();
            Stage stage = new Stage();
            stage.setTitle("COMP228 Project Registration Complete!");
            stage.setScene(new Scene(fxmlregister));
            stage.show();
        } else {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("registerfailed.fxml"));
            Parent fxmlregisterfailed = (Parent) fxmlLoader.load();
            Stage stage = new Stage();
            stage.setTitle("COMP228 Project Registration Failed!");
            stage.setScene(new Scene(fxmlregisterfailed));
            stage.show();
        }

【问题讨论】:

  • 您需要一个额外的“SELECT count(*) userAuth WHERE username = user AND password = pw”语句并检查它是否为零。你应该使用PreparedStatements
  • 邮件中有什么不清楚的地方?在插入之前您没有检查任何内容。您正在插入 (executeUpdate()),然后尝试第二次执行相同的插入查询,但这次使用只能执行 select 语句的 executeQuery。您还真的非常需要了解准备好的语句(如果名字是 O'Reilly 怎么办?),除非这是一些玩具项目,否则您真的不应该将密码存储在数据库中。

标签: java jdbc


【解决方案1】:

正如错误和@JBNizet 已经告诉您的那样,您正在尝试使用ExecuteQuery 执行相同的更新语句。

所以您尝试使用executeQuery 执行更新语句,您应该尝试使用查询的第二个命令

sql = "SELECT COUNT(1) FROM yourTable WHERE yourCondition = true";
ResultSet resultSet = registerStatement.executeQuery(sql);

你真的应该注意到@JBNizet 的评论,连接字符串来创建查询是不好的。

【讨论】:

    【解决方案2】:

    Answer by rekiem87 是正确的,问题上的两个 cmets 也是正确的。

    UPSERT

    除此之外,如果您希望更新现有记录或插入新记录,that behavior 通常称为UPSERT(意思是更新或插入)或“合并”。

    我记得,SQL 标准中没有定义这样的特性。但是许多数据库已经实现了一个。

    例如,在 Postgres 中,使用 INSERT ON CONFLICT。有关 Postgres 9.5,请参阅 this first lookthis tutorialthis postingfeature description 和 YouTube 上的 this presentation

    INSERT INTO user_ ( username_ , password_ )
    VALUES ( 'Alice' , 'pw123' ) 
    ON CONFLICT ( username_ )
    DO UPDATE SET ( password_ ) = ( 'pw123' )
    ;
    

    请注意,至少在 Postgres 实现中,如果行已经存在,您可以选择不执行任何操作。

    INSERT INTO user_ ( username_ , password_ )
    VALUES ( 'Alice' , 'pw123' ) 
    ON CONFLICT ( username_ )
    DO NOTHING
    ;
    

    当然,我忽略了正确存储用户密码的整个主题。我确信问题中的这个例子是相当做作的,你永远不会只写密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多