Java SQL访问行数据

Java SQL访问行数据,java,sql,jdbc,Java,Sql,Jdbc,我编写了一个Java应用程序,用户可以在其中登录/注册。这已经起作用了。 但不知何故,当我试图编码逻辑以检查用户是否已经存在时,我得到了一个错误多于一个错误 这是我的代码: public static void checkRegister(String mail) { try { // create a mysql database connection Class.forName(myDriver);

我编写了一个Java应用程序,用户可以在其中登录/注册。这已经起作用了。 但不知何故,当我试图编码逻辑以检查用户是否已经存在时,我得到了一个错误多于一个错误

这是我的代码:

public static void checkRegister(String mail) {

        try {
            // create a mysql database connection

            Class.forName(myDriver);
            Connection conn = DriverManager.getConnection(myUrl, user, passwordDB);

              // the mysql insert statement
              String query = "SELECT COUNT(email) mailc, email from users where users.email = \"" + mail + "\"";

              // create the mysql insert preparedstatement
              PreparedStatement preparedStmt = conn.prepareStatement(query);

              // execute the preparedstatement
              preparedStmt.execute();
            conn.close();
        } catch (Exception e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
        }
    }
我尝试使用
preparedStmt.getResultSet().getInt(“mailc”)
但不起作用

尚未注册的邮件示例

已注册邮件示例


我的目的是检查mailc是否大于0。

请修改您的代码:

String query = "SELECT COUNT(email) mailc, email from users where users.email =?";

// create the mysql insert preparedstatement
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString(1,mail);
// execute the preparedstatement
preparedStmt.execute();

请修改您的代码,如下所示:

String query = "SELECT COUNT(email) mailc, email from users where users.email =?";

// create the mysql insert preparedstatement
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString(1,mail);
// execute the preparedstatement
preparedStmt.execute();

您必须使用AS
Count(c)AS col
如下:

String query = "SELECT COUNT(email) AS mailc, email from users ....";
我建议改用PreparedStatement的
,以避免任何SQL注入。因此,您的查询应该如下所示:

String query = "SELECT COUNT(email) mailc, email from users where users.email =?";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString(1, mail);
要获得结果,必须使用结果集:

String query = "SELECT COUNT(email) AS mailc, email from users where users.email =?";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString(1, mail);

ResultSet result = preparedStmt.executeQuery();
while (result.next()) {
   int count = result.getInt("mailc");
   String email = result.getString("email");
}

您必须使用AS
Count(c)AS col
如下:

String query = "SELECT COUNT(email) AS mailc, email from users ....";
我建议改用PreparedStatement的
,以避免任何SQL注入。因此,您的查询应该如下所示:

String query = "SELECT COUNT(email) mailc, email from users where users.email =?";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString(1, mail);
要获得结果,必须使用结果集:

String query = "SELECT COUNT(email) AS mailc, email from users where users.email =?";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString(1, mail);

ResultSet result = preparedStmt.executeQuery();
while (result.next()) {
   int count = result.getInt("mailc");
   String email = result.getString("email");
}

ResultSet rs=stmt.executeQuery(查询)

您的代码可能会工作,语句不是完美的,但可以工作。你能提供例外,我们会解决它吗?
或者您可以尝试在查询中使用'instead of'

ResultSet rs=stmt.executeQuery(查询)

你的代码可能会工作,语句不是完美的,但可以工作。你能提供验证,我们会解决它吗?
或者,您可以尝试在查询中使用“而不是”,在这里做一些猜测:您想检查
用户
表中是否至少有一个用户具有该电子邮件地址,并且该查询将始终在一个给定地址上运行,而不是在地址列表上运行

你可能想考虑一下你对这个问题的质疑:你想检查这个值是否存在,但是你要求你的数据库来计算有多少电子邮件。这是一个很好的例子,因为只有一个这样的用户或者根本没有用户。但在更复杂的用例中,您实际上会迫使数据库做更多它应该做的工作,这将影响您的应用程序性能

我建议您使用的正确查询实际上是:

select case when
  exists (select 1 from users where mail = ?)
  then 1 else 0 end as answer
from dual //this is a synthetic table which some DB vendors need.
          //that whole line can be removed if your DB vendor doesn't require it.
相应的Java代码是:

void checkRegistered(String email) {
  initDriver();
  // note the try block below: it will close all resources you have allocated
  try (Connection conn = DriverManager.getConnection(uri, credentials.name, credentials.pwd);
       PreparedStatement st = conn.prepareStatement(query);
       ResultSet result = st.executeQuery()) {
    if (result.next() && result.getInt("answer") == 1) {
      //do here whatever you do when user is invalid.
    }
  }
}

在这里做一些猜测:您想检查
users
表中是否至少有一个用户具有该电子邮件地址,并且该查询将始终在一个给定地址上运行,而不是在地址列表上运行

你可能想考虑一下你对这个问题的质疑:你想检查这个值是否存在,但是你要求你的数据库来计算有多少电子邮件。这是一个很好的例子,因为只有一个这样的用户或者根本没有用户。但在更复杂的用例中,您实际上会迫使数据库做更多它应该做的工作,这将影响您的应用程序性能

我建议您使用的正确查询实际上是:

select case when
  exists (select 1 from users where mail = ?)
  then 1 else 0 end as answer
from dual //this is a synthetic table which some DB vendors need.
          //that whole line can be removed if your DB vendor doesn't require it.
相应的Java代码是:

void checkRegistered(String email) {
  initDriver();
  // note the try block below: it will close all resources you have allocated
  try (Connection conn = DriverManager.getConnection(uri, credentials.name, credentials.pwd);
       PreparedStatement st = conn.prepareStatement(query);
       ResultSet result = st.executeQuery()) {
    if (result.next() && result.getInt("answer") == 1) {
      //do here whatever you do when user is invalid.
    }
  }
}


他已经在使用
PrepapredStatement
,只是他的语法有误是的,我知道@YoungMillie你是什么意思?我不明白你在做这么多的编辑,在我发表评论的时候,你说他应该使用他已经在使用的
PrepapredStatement
。现在你已经编辑好了,一切都好了。谢谢你的建议。我在代码中更改了它。但是我怎样才能检查col“mailc”的值呢`preparedStmt.getResultSet().getInt(“mailc”)')似乎没有work@piguy如果你发现答案是正确的或有帮助的,当人们努力回答问题时,一定要向上投票。因此,请感谢我们的努力。他已经在使用
PrepapredStatement
,只是他的语法错误是的,我知道@YoungMillie你的意思是什么?我不明白你在做这么多的编辑,在我发表评论的时候,你说他应该使用他已经在使用的
PrepapredStatement
。现在你已经编辑好了,一切都好了。谢谢你的建议。我在代码中更改了它。但是我怎样才能检查col“mailc”的值呢`preparedStmt.getResultSet().getInt(“mailc”)')似乎没有work@piguy如果你发现答案是正确的或有帮助的,当人们努力回答问题时,一定要向上投票。所以,请感谢您的努力。谢谢您的建议。我在代码中更改了它。但是我怎样才能检查col“mailc”的值呢`preparedStmt.getResultSet().getInt(“mailc”)似乎不起作用。谢谢你的建议。我在代码中更改了它。但是我怎样才能检查col“mailc”的值呢`preparedStmt.getResultSet().getInt(“mailc”)')似乎不起作用上面的代码正在起作用-我的问题是如何处理结果以从列“mailc”中获取值,并添加preparedStmt.getResultSet().getInt(“mailc”)给我nullPointerExceptionresultSet=preparedStmt.ExecuteQuery您能解释一下您的评论吗?我想听哪场比赛?我试图在没有eclipse的情况下解决这个问题。实际上这个答案并不太好。当您有代码时,请相应地格式化它。您还应该解释为什么“该代码不完美”。相信我:否决其他答案不是一个有用的模式。提供高质量的答案;然后信誉自动流入。上面的代码正在工作-我的问题是如何处理结果以从列“mailc”中获取值,并添加preparedStmt.getResultSet()。getInt(“mailc”)为我提供nullPointerExceptionresultSet=preparedStmt.ExecuteQuery您能解释一下您的评论吗?我想听哪场比赛?我试图在没有eclipse的情况下解决这个问题。实际上这个答案并不太好。当您有代码时,请相应地格式化它。您还应该解释为什么“该代码不完美”。相信我:否决其他答案不是一个有用的模式。提供高质量的答案;然后声誉就会自动流入。谢谢你——这正是我所需要和尝试的。这个很好用:)谢谢