如果sql查询未找到任何内容,如何处理?在java中使用resultset

如果sql查询未找到任何内容,如何处理?在java中使用resultset,java,sql,login,derby,resultset,Java,Sql,Login,Derby,Resultset,我在这个网站上找到了一些关于这个问题的答案,但是没有能够正确地应用它。我试图获取用户输入的用户名和密码,并对照数据库检查其是否正确。除非输入的用户名不在数据库中,否则一切正常。在这种情况下,查询找不到任何行。我正在用netbeans中的derby做这件事。因此,我想我只是在检测何时使用未知用户名发送查询时遇到了问题。有什么建议吗 import java.io.IOException; import java.io.PrintWriter; import java.sql.*; import ja

我在这个网站上找到了一些关于这个问题的答案,但是没有能够正确地应用它。我试图获取用户输入的用户名和密码,并对照数据库检查其是否正确。除非输入的用户名不在数据库中,否则一切正常。在这种情况下,查询找不到任何行。我正在用netbeans中的derby做这件事。因此,我想我只是在检测何时使用未知用户名发送查询时遇到了问题。有什么建议吗

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "MyServlet", urlPatterns ={"/echo"})
public class LoginAction extends HttpServlet {
private ResultSet resultSet;
private Connection con;

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html; charset=UTF-8");
    PrintWriter out = response.getWriter();
    try {
    out.println("<!DOCTYPE html>");
    out.println("<html><head>");
    out.println("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>");
    String userName = request.getParameter("username");
    String password = request.getParameter("password");
    if (userName.length()>0 & password.length()>0){
        try{
            String url = "jdbc:derby:c:/users/project/.netbeans-derby/";
            String db = "loginpass";
            String driver = "org.apache.derby.jdbc.EmbeddedDriver";
            String user = "user";
            String pass = "pass";
            Class.forName(driver).newInstance();
            con = DriverManager.getConnection(url+db, user, pass);
            String statement = "SELECT PASSWORD FROM LOGINPASS WHERE LOGIN = '"+userName+"'";
            PreparedStatement prepStatement = con.prepareStatement(statement);
            resultSet = prepStatement.executeQuery();

            while (resultSet.next()){
               if (resultSet.getString("password").equals(password)){
                   out.println("Login attempt successful!");
                   out.println("<br><a href='index.jsp'>Back to Login Page</a>");
               } else {
                   out.println("Password incorrect");
                   out.println("<br><a href='index.jsp'>Back to Login Page</a>");
               }
            }
            con.close();
        }catch(Exception e){
            out.println("caught...");
            e.printStackTrace();
        }
     } else {
        out.println("Login attempt failed");
        out.println("<a href='index.jsp'>Back to Login Page</a>");
     }
     } finally {
        out.close();  
     }
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}
import java.io.IOException;
导入java.io.PrintWriter;
导入java.sql.*;
导入javax.servlet.ServletException;
导入javax.servlet.annotation.WebServlet;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
@WebServlet(name=“MyServlet”,urlPatterns={”/echo})
公共类登录扩展了HttpServlet{
私有结果集结果集;
私人连接;
@凌驾
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
setContentType(“text/html;charset=UTF-8”);
PrintWriter out=response.getWriter();
试一试{
out.println(“”);
out.println(“”);
out.println(“”);
字符串userName=request.getParameter(“用户名”);
字符串密码=request.getParameter(“密码”);
if(userName.length()>0和password.length()>0){
试一试{
String url=“jdbc:derby:c:/users/project/.netbeans-derby/”;
String db=“loginpass”;
String driver=“org.apache.derby.jdbc.EmbeddedDriver”;
字符串user=“user”;
字符串pass=“pass”;
Class.forName(driver.newInstance();
con=DriverManager.getConnection(url+db、用户、通行证);
String statement=“从登录过程中选择密码,其中LOGIN='”+userName+'”;
PreparedStatement prepStatement=con.PreparedStatement(报表);
resultSet=prepStatement.executeQuery();
while(resultSet.next()){
if(resultSet.getString(“密码”).equals(密码)){
println(“登录尝试成功!”);
out.println(“
”); }否则{ out.println(“密码不正确”); out.println(“
”); } } con.close(); }捕获(例外e){ out.println(“捕获…”); e、 printStackTrace(); } }否则{ out.println(“登录尝试失败”); out.println(“”); } }最后{ out.close(); } } @凌驾 受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)引发ServletException、IOException{ doGet(请求、响应); }
您可以从
结果集
对象本身检查:

检索光标是否位于此ResultSet对象的第一行之前

注意:对于结果集类型仅为“前进”类型的结果集,对isBeforeFirst方法的支持是可选的

返回:

如果光标位于第一行之前,则为true;如果光标位于任何其他位置或结果集不包含行,则为false。

if(!resultSet.isBeforeFirst()){
out.println(“未提取行”);
out.println(“未找到此密码的用户”);
out.println(“
”); }
您可以从
结果集
对象本身检查:

检索光标是否位于此ResultSet对象的第一行之前

注意:对于结果集类型仅为“前进”类型的结果集,对isBeforeFirst方法的支持是可选的

返回:

如果光标位于第一行之前,则为true;如果光标位于任何其他位置或结果集不包含行,则为false。

if(!resultSet.isBeforeFirst()){
out.println(“未提取行”);
out.println(“未找到此密码的用户”);
out.println(“
”); }
在While之前(resultSet.next()),键入if(resultSet!=null)。如果查询没有结果,则resultSet将为null。

在While之前(resultSet.next()),键入if(resultSet!=null)。如果查询没有结果,则resultSet将为null。

正如您预期的只有一行一样,您可以编写:

if (resultSet.next()) {
    if (resultSet.getString("password").equals(password)){
        out.println("Login attempt successful!");
        out.println("<br><a href='index.jsp'>Back to Login Page</a>");
    } else {
        out.println("Password incorrect");
        out.println("<br><a href='index.jsp'>Back to Login Page</a>");
    }
} else {
    out.println("User doesn't exist");
    out.println("<br><a href='index.jsp'>Back to Login Page</a>");
}

由于预期只有一行,您可以编写:

if (resultSet.next()) {
    if (resultSet.getString("password").equals(password)){
        out.println("Login attempt successful!");
        out.println("<br><a href='index.jsp'>Back to Login Page</a>");
    } else {
        out.println("Password incorrect");
        out.println("<br><a href='index.jsp'>Back to Login Page</a>");
    }
} else {
    out.println("User doesn't exist");
    out.println("<br><a href='index.jsp'>Back to Login Page</a>");
}

如果结果集为null,则If条件将为false,而while条件从未被检查过。因此,光标永远不会移动!如果sql查询没有返回任何记录,则并不意味着结果集为null。结果集null并不意味着结果为空。我没有正确阅读您的帖子,请忽略我的第一条评论。我以为您在做一个resultset.next查找resultset是否为空。我在一开始就尝试过,但对我无效。谢谢!executeQuery()从不返回null!是的。从不返回null,但是当它没有找到任何记录时,它什么也不返回!结果集将保持null。如果结果集为null,则If条件将为false,而while条件从未被检查过。因此光标永远不会移动!如果sql查询没有返回任何记录,则并不意味着resultSet将为null、 resultSet null并不意味着结果为空。我没有正确阅读您的帖子,请忽略我的第一条评论。我以为您正在进行resultSet。下一步是查找resultSet是否为空。我在一开始就尝试过,但这对我不起作用。谢谢!executeQuery()从不返回null!是的。从不返回null,但是当它没有找到任何记录时,它什么也不返回!结果集将保持null。谢谢这样做,我不习惯只考虑一行,所以这对我尝试做的工作有效。谢谢!谢谢这样做,我不习惯只考虑一行,所以这对我来说是有效的试着去做。谢谢!我会记住这一点,我会的
String statement = "SELECT PASSWORD FROM LOGINPASS WHERE LOGIN = ?";
PreparedStatement prepStatement = con.prepareStatement(statement);
prepStatement.setString(1, userName);
resultSet = prepStatement.executeQuery();