1,JDBC的相关API:

DriverManager 用于注册数据库连接驱动;
Connection 获取数据库连接对象;
Statement 创建语句对象;
ResultSet 获取结果集
PreparedStatement 创建预编译的语句对象,解决sql注入问题的 衍生子类(Statement的子类)

a,Statement 的 两个sql操作方法:

executeUpdate 用于对数据库数据的增删改操作
executeQuery 用于对数据库数据的查询操作(select)

b,ResultSet 获取数据的相关API:

image.png
image.png

2,JDBC的使用步骤:

  1. 创建连接对象:DriverManager . getConnection

    1. Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/day17", "root", "root");
    2. //jdbc:mysql://localhost:3306/day17
    3. //连接数据库的url;
  2. 获取sql语句对象:

    1. Statement statement = connection.createStatement();
  3. 执行sql语句:

    1. 增删改的格式:

      1. //执行sql语句并返回一个影响的行数;(增删改:executeUpdate)
      2. int i = statement.executeUpdate("insert into user value (null,'xtl','0000'),(null,'jdi','9999')");
    2. 查询的格式:

      1. //定义要执行的sql语句:
      2. String sql1 = ("select * from USER ");
      3. //提交sql语句并获取执行查询的结果集;
      4. ResultSet rs = statement.executeQuery(sql1);
  4. 遍历数据库获取对应的字段: ```java // //遍历数据库索引获取对应字段: /*

    1. next先后移动一位,如过遍历完后返回false

    */ // while (rs.next()) {

    1. String id = rs.getString("id");
    2. String name = rs.getString("name");
    3. String passward = rs.getString("password");
    4. User user = new User(id, name, passward);

    //将获取的数据封装到对象并放到list集合中

    1. list.add(user);

}

  1. 5. **关闭连接:**
  2. ```java
  3. rs.close();
  4. statement.close();
  5. connection.close();

image.png

3,什么是SQL注入:

  1. 按照正常道理来说,我们在密码处输入的所有内容,都应该认为是密码的组成。
  2. 但是现在Statement对象在执行sql语句时,将密码的一部分内容当做查询条件来执行了。
  3. 原因示例: ```java “SELECT * FROM user WHERE name=’” + name + “‘ AND password=’” + password + “‘;”;

// 将用户输入的账号密码拼接后 “SELECT FROM user WHERE name=’hehe’ AND password=’a’or’1’=’1’;” //此时的sql语句将变成: “SELECT FROM user WHERE TRUE” //意思就是查询整张表,并返回true导致条件逻辑错误;

  1. <a name="SFPuJ"></a>
  2. ## A,sql注入的解决:( 及 预编译语句对象:PreparedStatement 的使用)
  3. <a name="PHNeB"></a>
  4. ### 1,为何PreparedStatement对象可以避免sql的注入问题 ?:
  5. 1. 预编译:SQL语句在执行前就已经编译好了,执行速度更快。;
  6. 1. 安全性更高:没有字符串拼接的SQL语句,所以避免SQL注入的问题;
  7. 1. 代码的可读性更好,因为没有字符串拼接;
  8. <a name="dIrHn"></a>
  9. ### 2, * PreparedStatement 对象的使用步骤:(Statement的子接口)
  10. 1. 创建连接对象;略(同上)
  11. 1. 创建PreparedStatement 预编译语句对象:
  12. 1. 也可以先定义sql语句并将需要变动的内容使用占位符进行代替:
  13. ```java
  14. //直接给sql语句:
  15. PreparedStatement preparedStatement = connection.prepareStatement("select * from tb_brand where status=?");
  16. //先定义语句后传入:
  17. String sql=("select * from tb_brand where status=?");
  18. //创建预编译的语句对象:
  19. PreparedStatement preparedStatement = connection.prepareStatement(sql);
  1. 3. **使用真实值替换占位符**:**preparedStatement . set**数据类型
  1. //(第几个占位符,真实的值)
  2. preparedStatement.setInt(1, 1);
  1. 4. 执行sql语句:
  1. //增删改操作:(注意:这里不需要再传入sql语句,因为在上面已经有了,而且会进行预先编译)
  2. preparedStatement.executeUpdate();
  3. //查询操作:
  4. preparedStatement.executeQuery();
  1. 5. 遍历数据并保存到对象;略(同上)
  2. 5. 关闭连接;同上

image.png