jdbc

2024/07/05 Java

为什么需要JDBC

我们使用IO流,实现了数据的持久化,但是数据的格式和存储,不方便查看和管理

MYSQL数据库使用了行和列来进行数据的存储,JDBC就是java中用来操作是数据库的

JDBC的简单例子

    import java.sql.DriverManager;

public static void main(String[] args) throws ClassNotFoundException, SQLException {
    // 1. 加载JDBC驱动,以下两种方式皆可,不过1.6之后已经不需要注册驱动了
//    Class.forName("com.mysql.cj.jdbc.Driver");
//    DriverManager.registerDriver(new Driver());
    // 2. 获取链接对象
    Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/atguigu", "root", "123456");
    // 3. 获取执行Sql对象
    Statement s = c.createStatement();
    String sql = "select emp_id, emp_name, emp_salary, emp_age from t_emp;";
    // 4. 获取返回结果对象
    ResultSet resultSet = s.executeQuery(sql);
    while (resultSet.next()) {
        int empId = resultSet.getInt("emp_id");
        String empName = resultSet.getString("emp_name");
        double empSalary = resultSet.getDouble("emp_salary");
        int empAge = resultSet.getInt("emp_age");
        System.out.println(empId + " " + empName + " " + empSalary + " " + empAge);
    }
    // 先开后关
    resultSet.close();
    s.close();
    c.close();
}

Statement引发的SQL注入问题

 private static void method2() throws SQLException {
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/atguigu", "root", "123456");
        // 3. 获取执行Sql对象
        Statement s = c.createStatement();
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        String sql = "select emp_id, emp_name, emp_salary, emp_age from t_emp where emp_name = '" + name + "'";
        // 4. 获取返回结果对象
        ResultSet resultSet = s.executeQuery(sql);
        while (resultSet.next()) {
            int empId = resultSet.getInt("emp_id");
            String empName = resultSet.getString("emp_name");
            double empSalary = resultSet.getDouble("emp_salary");
            int empAge = resultSet.getInt("emp_age");
            System.out.println(empId + " " + empName + " " + empSalary + " " + empAge);
        }
        resultSet.close();
        s.close();
        c.close();
    }

有一条数据叫做的名称叫做andy,

andy

但是我们现在这样输入,就会获取到所有的数据:

andy’ or ‘1’ = ‘1

PreparedStatement解决Sql注入问题

  private static void method3() throws SQLException {
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/atguigu", "root", "123456");
        // 3. 获取执行Sql对象
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入名称:");
        String name = scanner.nextLine();

        PreparedStatement s = c.prepareStatement("select emp_id, emp_name, emp_salary, emp_age from t_emp where emp_name = ?");
        // 4. 获取返回结果对象
        s.setString(1, name);
        ResultSet resultSet = s.executeQuery();
        while (resultSet.next()) {
            int empId = resultSet.getInt("emp_id");
            String empName = resultSet.getString("emp_name");
            double empSalary = resultSet.getDouble("emp_salary");
            int empAge = resultSet.getInt("emp_age");
            System.out.println(empId + " " + empName + " " + empSalary + " " + empAge);
        }
        resultSet.close();
        s.close();
        c.close();
    }
    // andy' or '1' = '1 将不再输出结果

原理:会被当作一个普通值,而不是拼接语句。会默认给每一个?都加上一对单引号。 同时,里面的特殊字符都会添加上转义符号

所以以上内容的SQL结果会变成这样:select emp_id, emp_name, emp_salary, emp_age from t_emp where emp_name = ‘andy' OR '1' = '1’

Search

    Table of Contents