练习:登录案例
需求:
1.通过键盘录入用户名和密码
2.判断用户是否登录成功
步骤:
1.在数据库里面创建一个用户表
2.书写代码如下:
package cn.itcast.jdbc;
import cn.itcast.util.JDBCUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
/**
* 需求:
1.通过键盘录入用户名和密码
2.判断用户是否登录成功
*/
public class JdbcDemo10 {
public static void main(String[] args) {
//1.键盘录入,接收用户名和密码
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.next();
System.out.println("请输入密码");
String password = sc.next();
boolean login = new JdbcDemo10().login(username, password);
//System.out.println("111"+login);
if(login){
System.out.println("登录成功");
}else{
System.out.println("用户名或密码错误");
}
}
/**
* 登录方法
*/
public boolean login(String username,String password){
Connection conn =null;
Statement stat =null;
ResultSet res =null;
if(username==null || password==null){
return false;
}
//连接数据库判断是否成功
//1.获取连接
try {
conn = JDBCUtils.getConnection();
//2.定义sql
String sql="select * from user where username='"+username+"' and password1='"+password+"'";
//3.获取执行sql的对象
stat = conn.createStatement();
//4.执行查询
res = stat.executeQuery(sql);
//System.out.println(res.next());
return res.next();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(res,stat,conn);
}
return false;
}
}
写这个案例的时候还有一件有趣的事情:
代码运行了好多次,无论怎么运行都处于用户登录失败的状态,我仔细检查好多遍代码,但是没有看出什么问题
最后一遍一遍的查看终于发现了问题的所在之处
问题出现的地方就在红色的方块内
我本来像打印一下看看res.next()方法的返回值是什么?
结果确实为true
但是后面我在返回值的地方又调用了一次res.next()方法
这就出现了问题,因为执行上面的sql语句查询到的结果集里面只有一条数据,当我第一次调用res.next()方法时候,会让游标向下移动到数据处
当我第二次在调用res.next()方法的时候,因为结果集里面只有一条数据所以游标再次向下移动的时候就会没有数据,所以第二次调用会返回false
所以我的程序才会一直给我返回false
当我把打印那行代码注释掉即全程值调用了一次res.next()方法,程序运行成功。得到正确的返回值。