JDBC-PreparedStatement

JDBC-PreparedStatement

PreparedStatement:执行sql的对象

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

    1. 随便输入用户,输入密码:'a' o 'a' ='a

    2. #sql
      select * from user where username='fdsad' 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: ?的值
    7. 执行sql,接受返回结果,不需要传递sql语句

    8. 处理结果

    9. 释放资源

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

    1. 可以防止SQL注入
    2. 效率更高

代码展示

package com.levizhao.PreparedStatement;

import com.levizhao.util.JDBClogin;

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

public class Demo01PreparedStatement {
    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();
        boolean flag = new Demo01PreparedStatement().Login(username, password);
        if (flag){
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败,账户或密码错误!");
        }


    }

    public boolean Login(String username, String password){
        if (username == null || password == null){
            return  false;
        }
        Connection conn = null;
        PreparedStatement pstat = null;
        ResultSet rs = null;

            //1. 获取连接
        try {
            conn = JDBClogin.getConnection();
            //2. 定义SQL语句
            String sql = "select * from login where name = ? and password = ?";
            //3. 执行SQL对象
            pstat = conn.prepareStatement(sql);
            //4. 给?赋值
            pstat.setString(1,username);
            pstat.setString(2,password);
            //5. 执行查询,不需要传递sql
            rs = pstat.executeQuery();
            return  rs.next();

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            // 关闭连接
            JDBClogin.close(rs,pstat,conn);
        }
        return  false;
    }
}

posted @ 2021-02-02 10:54  withLevi  阅读(60)  评论(0编辑  收藏  举报