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