JDBC练习_登录案例和JDBC事务管理

JDBC练习_登录案例

练习:

 需求:

  1.通过键盘录入用户名和密码

     2.判断用户是否登录成功

    "select * from user where username = " "  and password = " " ";

    如果这个sql有查询结果,则成功,反之则失败

 步骤:

  1.创建数据库表 user

-- JDBC练习表
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32),
password VARCHAR(32)
);
-- 查询
SELECT * FROM USER;
-- 添加数据
INSERT INTO USER VALUES(NULL,'zhangsan','123'),(NULL,'lisi','234');

  2.实现登录功能代码

 public static void main(String[] args) {
        //1.键盘录入,接收用户名和密码
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = scanner.nextLine();
        System.out.println("请输入密码");
        String password = scanner.nextLine();
        //2.调用方法
        boolean flag = new JdbcPractice8().login(username, password);
        //3.判断结果,输出不同语句
        if (flag){
            System.out.println("登录成功");
        }else {
            System.out.println("用户名或密码错误");
        }
    }



        /**
         * 登录方法
        */
        public boolean login(String username,String password){
            if (username == null || password == null){// 有一个为空直接返回false
                return false;
            }
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
            //连接数据库判断是否登录成功
            try {
                //1.获取连接对象
                conn = JDBCUtils.getConnection();
                //2.获取执行sql语句
                String sql = "select * from user where username = '"+username+"' and password = '"+password+"' ";
                //3.获取执行sql语句对象
                stmt = conn.createStatement();
                //4.执行sql语句
                rs = stmt.executeQuery(sql);
                //5.判断
                return rs.next();// 判断是否有下一行,有下一行返回true
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                //释放资源
                JDBCUtils.close(rs, stmt, conn);
            }
            //没有则返回false
            return false;
        }

运行结果:

 

 

 数据库:

 

 

 JDBC事务管理

PreparedStatement:执行sql的对象

  1.SQL注入问题:在拼接sql的特殊关键字参与字符串的拼接,会造成安全性问题

    1.输入用户随便,输入密码:'a ' or 'a ' = 'a' (错误)sql

select * from user where username = 'sdadsadas' and password = 'a ' or 'a ' = 'a' 

  2.解决sql注入问题:使用PreparedStatement对象来解决

  3.表示预编译的SQL语句的对象:参数使用?作为占位符

  4.步骤:

    ​1.导入驱动jar包:mysql-connector-java-5.1.37-bin.jar

      2、注册驱动

      3、获取数据库连接对象 Connection

      4、定义sql

        注意:sql的参数使用?作为占位符。如:select * from user where username = ? and password = ?;

      5、获取执行sql语句的对象 PreparedStatement, Connection.prepareStatement(String sql);

      6、给?赋值:

        方法:setXxx(参数1,参数2) 

          参数1:? 的位置编号,从1开始

          参数2:?的值

      6、执行sql,接受返回结果

      7、处理结果

      8、释放资源

  5.注意:后期都会使用PreparedStatement对象来完成增删改查的所有操作

   为什么呢?:

        1.可以防止SQL注入

        2.效率更高

    public static void main(String[] args) {
        //1.键盘录入,接收用户名和密码
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = scanner.nextLine();
        System.out.println("请输入密码");
        String password = scanner.nextLine();
        //2.调用方法
        boolean flag = new JdbcPractice8().login2(username, password);
        //3.判断结果,输出不同语句
        if (flag){
            System.out.println("登录成功");
        }else {
            System.out.println("用户名或密码错误");
        }
    }/**
     * 登录方法,使用PreparedStatement实现(PreparedStatement防止sql注入)
     */
    public boolean login2(String username,String password){
        if (username == null || password == null){// 有一个为空直接返回false
            return false;
        }
        //提升作用域
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        //连接数据库判断是否登录成功
        try {
            //1.获取连接对象
            conn = JDBCUtils.getConnection();
            //2.获取执行sql语句
            String sql = "select * from user where username = ? and password = ? ";
            //3.获取执行sql语句对象(PreparedStatement对象)
            pstmt = conn.prepareStatement(sql);
            //给?赋值
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            //4.执行sql语句
            rs = pstmt.executeQuery();// 子类
            //5.判断
            return rs.next();// 判断是否有下一行,有下一行返回true
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //释放资源
            JDBCUtils.close(rs, pstmt, conn);
        }
        //没有则返回false
        return false;
    }

运行结果:

 

 

 

posted @ 2022-10-21 16:35  monkey大佬  阅读(73)  评论(0)    收藏  举报