JDBC练习:登陆案例

JDBC练习:登陆案例

需求:
1、通过键盘登入用户名和密码
2、判断用户是否登陆成功
步骤

1、创建数据库表


	CREATE TABLE USER(
		id INT PRIMARY KEY AUTO_INCREMENT,
		username VARCHAR(20),
		PASSWORD VARCHAR(20)
	);
	INSERT INTO USER VALUES(NULL,'zhangsan',123);
	INSERT INTO USER VALUES(NULL,'lisi',456);

2、创建一个TestRegister类,登陆功能


package www.bit.register;

import www.bit.util.JdbcUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/**
 * @author Dangxuchao
 * @Title: TestRegister
 * @ProjectName JDBC
 * @Description: 写一个登陆方法
 * @date 2019/8/4 11:02
 */
public class TestRegister {
    public static void main(String[] args) {
        //键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();
        login(username,password);
    }
    /*
     1、通过键盘登入用户名和密码
     2、判断用户是否登陆成功
    */
    public static void login(String username,String password){
        if (username==null && password==null){
            return ;
        }
        Connection connT = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //获取数据库链接
            connT =  JdbcUtils.getConnection();
            String sql = "select * from user where username='"+username+"'and password='"+password+"'";
            stmt = connT.createStatement();
            rs = stmt.executeQuery(sql);
            //判断结果集有没有数据,并且确认一些
            //System.out.println(rs.next());
            if (rs.next()){
                System.out.println(rs);
                System.out.println("登陆成功");

            }else {
                System.out.println("登陆失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(rs,stmt,connT);
        }
    }
}
结果:
JDBC练习:登陆案例_第1张图片 JDBC练习:登陆案例_第2张图片

第二个版本:

解决了sql注入问题:

出现的sql注入问题:数据库根本不存在这样的数据
JDBC练习:登陆案例_第3张图片
解决sql注入问题:

Statement执行的sql语句全是静态的sql,容易产生注入问题;
使用 PreparedStatement 对象来解决,执行的是预编译sql,使用?作为占位符;

package www.bit.register;

import www.bit.util.JdbcUtils;

import java.sql.*;
import java.util.Scanner;

/**
 * @author Dangxuchao
 * @Title: TestRegister2
 * @ProjectName JDBC
 * @Description: 改良版本
 * @date 2019/8/4 13:16
 */
public class TestRegister2 {
    public static void main(String[] args) {
        //键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();
        login(username,password);
    }
    /*
     1、通过键盘登入用户名和密码
     2、判断用户是否登陆成功
    */
    public static void login(String username,String password){
        if (username==null && password==null){
            return ;
        }
        Connection connT = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            //获取数据库链接
            connT =  JdbcUtils.getConnection();
            String sql = "select * from user where username=? and password= ?";
            pstmt = connT.prepareStatement(sql);
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            rs = pstmt.executeQuery();
            //判断结果集有没有数据,并且确认一些
            //System.out.println(rs.next());
            if (rs.next()){
                System.out.println(rs);
                System.out.println("登陆成功");

            }else {
                System.out.println("登陆失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(rs,pstmt,connT);
        }
    }
}

注意一下这个继承关系
执行结果
JDBC练习:登陆案例_第4张图片

关于PreparedStatement的使用方法请看另外一篇博客

你可能感兴趣的:(MySQL)