/*
* 需求:
1. 通过键盘录入用户名和密码
2. 判断用户是否登录成功
*/
public class JdbcDemo11 {
public static void main(String[] args) {
//1.键盘录入 接受用户名和密码
Scanner sc= new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.nextLine();
System.out.println("请输入密码");
String password = sc.nextLine();
//2.调用方法 返回Boolean
boolean flag = new JdbcDemo11().login02(username,password);
//3.判断结果 输出语句
if (flag=true){
System.out.println("登陆成功");
}else{
System.out.println("用户名或者密码错误");
}
}
//登录方法
public static boolean login02(String username, String password){
if (username==null&&password==null){
return false;
}
/*连接数据库来判断是否登陆成功
* select * from user where username = '"+username+"' and password = '"+password+"';
* 如果这个sql有查询结果,则成功,反之,则失败
*/
//1.获取数据库连接
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
conn = JdbcUtils.getConnection();
//2.定义sql
String sql = "select * from user where username = ? and password = ?";
//3.获取执行sql的对象
pstmt = conn.prepareStatement(sql);
//给问号赋值
pstmt.setString(1,username);
pstmt.setString(2,password);
//4、执行查询 返回结果集resultSet对象
rs = pstmt.executeQuery(); //这里不需要传递sql了
//5.判断
/*if (rs.next()){ //如果有下一行则返回true
return true;
}else{
return false; //
}*/
return rs.next(); //游标下移一行有数据true 无数据返回false
} catch (SQLException e) {
e.printStackTrace();
}finally{
JdbcUtils.close(rs,pstmt,conn);
}
return false; //这里的false相对与上面的如果出现了异常就返回这个false 因为之前的先判断
}
}
//jdbc工具类 JDBCUtils类 一个是获取连接的一个是释放资源的
public class JDBCUtils {
//把需要的三个变量 url user password原来是局部变量 我们在成员变量位置声明 如何静态代码块来赋值 下面就可以直接使用了
private static String url; //为什么这里加了static静态 因为只有静态的变量才能被静态代码块所使用
private static String user;
private static String password;
private static String driver;
//使用配置文件的方式 使用静态代码块 因为静态代码块会随着类的加载而加载而且只会执行一次
static{//用静态代码块来读取配置文件来获取值
try {
//1.用Properties集合类比较简单
Properties pro =new Properties();
pro.load(new FileReader("C:\\IdeaProject\\itcast\\day04-jdbc\\src\\cn\\itcast\\utils\\jdbc.properties")); //load可以记载字节流也可以是字符流进内存 这里加进去的是字符流
//获取数据赋值
url =pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password"); //这里面的名称要与配置文件中键的名称一样
driver=pro.getProperty("driver");
//注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace(); //forName的异常抓出来
}
} catch (IOException e) { //load的异常抓出来
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException { //工具类用静态方法直接类名点来调用
return DriverManager.getConnection(url, user, password);
}
public static void close(Connection conn){ //这个是一个重载
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection conn, Statement stmt, ResultSet result){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
result.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}