JDBC 概念:

  • JDBC就是使用JAVA操作关系型数据库的一套API
  • Java DataBase Connectivity(JAVA数据库链接)
  • JDBC 是一套标准的接口
  • 每个关系型数据库都有自己的实现类(驱动),使用哪个数据库导入哪个数据库的jar包。

image.png

JDBC快速入门

步骤

image.png

  • 注册驱动
    • Class.froName(“驱动jar包”) —反射代码 反射该类的名将类加载进内存
  • 获取链接
    • 使用Connection
  • 定义SQL语句
    • String sql =’xxx’
  • 获取执行SQL对象

    • Statement

      JDBC API 详解

  • DriverManager

  • Connection
  • Statement
  • ResultSet
  • PreparedStatement

    DriverManager

  • 管理一组JDBC驱动的工具类,里面的方法都是工具类

  • 两个方法很重要
    • getConnection(url, user , password) 获取数据库链接
    • registerDriver(Driver driver) 注册给定的数据库驱动程序
      • 注册驱动 mysql驱动5版本以上可以忽略
  • 获取链接
  • getConnection(url, user , password) 获取数据库链接
  • 参数
  • url : 数据库路径
    • 语法:jdbc:mysql:// ip地址:端口号/数据库名称?参数键值对1&参数键值对2…
    • 例如:jdbc:mysql://127.0.0.1:3306/test
    • 链接本地数据库可以忽略地址以及端口号直接写数据库名称
      • jdbc:mysql:///数据库名称?参数键值对1&参数键值对2…
  • user: 数据库用户名
  • password: 数据库密码

    Connection

  • Connection(数据库链接) 作用:

    • 获取执行SQL的对象
    • 管理事务
  • 获取执行SQL对象
    • 普通执行SQL对象 Statement createStatement()
    • 预编译SQL的执行SQL对象: 防止SQL注入 PreparedStatement prepareStatement(sql)
    • 执行存储过程的对象 CallableStatement prepareCall(sql)
  • 事务管理
  • MySQL事务管理
    • 开启事务:BEGIN;/START TRANSACTION;
    • 提交事务:COMMIT;
    • 回滚事务:ROLLBACK;
    • MySQL 默认自动提交事务
  • JDBC 事务管理:Connection接口中定义了3个对应的方法

    • 开启事务:setAutoCommit(boolean autoCommit): true为自动提交事务;false为手动
    • 提交事务:commit();
    • 回滚事务:rollback();

      Statement

  • Statement作用

    • 执行SQL语句— 增删改查
  • 执行SQL语句

    • int executeUpdate 执行DDL(数据库表的增删改查),DML(对数据的增删改操作)
      • 返回值:
        1. DML语句影响的行数
          • // 获取执行DML的sql的对象类Statement
            Statement stmt = conn.createStatement();
            int executeUpdate = stmt.executeUpdate(update);
        1. DDL 语句执行后,执行成功也可能返回0
          • // 获取执行DDL的sql的对象类Statement
            Statement stmt = conn.createStatement();
            int executeUpdate = stmt.executeUpdate(delete);
    • ResultSet executeQuery(sql): 执行DQL(查询数据操作)
      • 返回值: ResultSet 结果集对象

        ResultSet

  • ResultSet

    • 封装了DQL查询语句的结果
    • executeQuery(sql) : 执行DQL语句查询,返回ResultSet对象
    • 同样调用statement方法,不同的是增删改查调用excuteUpdate()查询调用excuteQuery()
  • 查询结果获取:
    • boolean next()
      1. 将光标从当前位置向前移动一行
    • image.png
      1. 判断当前行是否为有效行
  • 返回值:
    • true: 有效行,当前行有数据
    • false: 无效行,当前行没有数据
  • xxx getXxx(参数) 获取数据
    • xxx: 数据类型;
    • 获取id就是getInt(),获取姓名就是getString()
    • 如: int getInt(参数); String getString(参数)
    • getXxx的参数:
      • int: 列的编号,从1开始
      • String: 列的名称
  • 使用步骤:
      1. 游标向下移动,判断该行是否有数据:next()
      1. 获取数据:getXxx(参数) 参数可以是列的编号从1开始,也可以是列名
    • // 创建获取SQL的对象类Statement
      Statement stmt = conn.createStatement();
      ResultSet resultSet = stmt.executeQuery(sql);
      // 处理结果,遍历ResultSet的结果集,参数为列的编号
      while (resultSet.next()) {
      // 获取结果
      int id = resultSet.getInt(1);
      String name = resultSet.getString(2); }
    • // 处理结果,遍历ResultSet的结果集,参数为列的名称
      while (resultSet.next()) {
      // 获取结果
      int id = resultSet.getInt(id);
      String name = resultSet.getString(name); }
  • ResultSet 案例
    • 页面查询全部数据的来源是来自数据库
    • 将每一行的数据封装成一个java对象,将这个对象存储到ArrayList集合中

image.png

  • 操作步骤
  • 创建一个需要查询的实体类对应数据库的字段才能将数据封装到java对象中
  • 使用Statement执行ResultSet的查询数据库sql语句
  • 将查询的数据放入创建的集合中

// 定义SQL查询DQL语句
String sql = “select from sell_demo”;
// 创建获取SQL的对象类Statement
Statement stmt = conn.createStatement();
ResultSet resultSet = stmt.executeQuery(sql);
// 创建集合
List<Sell> list = new ArrayList<>();
// 处理结果,便利ResultSet的结果集
while (resultSet.next()) {
// 创建对象
Sell sell = new Sell();
// 获取结果
int id = resultSet.getInt(1);
String name = resultSet.getString(2);
String password1 = resultSet.getString(3);
String gender = resultSet.getString(4);
// 将查询的数据给对象赋值
sell.setId(id);
sell.setName(name);
sell.setPassword(password1);
sell.setGender(gender);
// 添加到创建的list对象中
list.add(sell); }
System.out.println(list*)
;

PreparedStatement

  • 预编译SQL语句对象: 预防SQL注入问题
  • SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
  • PreparedStatement预编译功能是默认关闭的
  • 开启:useServerPrepStmts=true 将该语句添加在url链接数据库路径的后面
  • String url = “jdbc:mysql://127.0.0.1:3306/xxx?userSSL=false?useServerPrepStmts=true”;
  • SQL注入的操作步骤
  • // 接收用户输入 用户名和密码
    String name = “lc”;
    String pwd = “‘ or ‘1’ = ‘1”; // 关键万能sql注入语句
    // 拼接sql语句字符串将java对象放入语句中使用‘“+xx+”’
    String sql = “select from dept where name = ‘“+name+”‘ and password = ‘“+pwd+”‘“;
    // 获取Statement对象
    Statement stmt = conn.createStatement();
    // 执行sql
    final ResultSet resultSet = stmt.executeQuery(sql);
    if (resultSet.next()) {
    System.out.println(“登录成功”);
    }else {
    System.out.println(“error”);
    *}
  • 普通用户登录操作步骤
    • 创建用户名和密码的java对象
    • 拼接sql以及java对象语句
    • select * from xx where name = ‘“+name+”‘ and password = ‘“+pwd+”‘;
  • // 接收用户输入 用户名和密码
    String name = “test”;
    String pwd = “test”;
    // 拼接sql语句字符串将java对象放入语句中使用‘“+xx+”’
    String sql = “select from dept where name = ‘“+name+”‘ and password = ‘“+pwd+”‘“;
    // 获取Statement对象
    Statement stmt = conn.createStatement();
    // 执行sql
    final ResultSet resultSet = stmt.executeQuery(sql);
    if (resultSet.next()) {
    System.out.println(“登录成功”);
    }else {
    System.out.println(“error”);
    *}
  • PreparedStatemet作用
  • 预编译SQL并执行SQL语句
    • 获取PreparedStatement对象
    • // SQL语句中的参数值使用? 代替原有的java对象占位符
      • String sql = “select * from user where username = ? and password = ?”;
    • // 通过Connection对象获取,并传入对应的sql语句
      • PreparedStatement pstmt = conn.prepareStatement(sql);
  • 设置占位符 ?的参数值
    • PreparedStatement 对象: 调用setXxx(参数1,参数2):给?赋值
    • Xxx: 数据类型; 如setInt(参数1 , 参数2)
    • 参数:
      • 参数1: ?的位置编号,从1开始 (对应的数据列)
      • 参数2: ?的值 (对应的数据列名称)
  • 执行SQL
    • executeUpdate();executeQuery(); 不用传递sql参数
  • 执行预编译SQL语句
    • // 接收用户输入 用户名和密码
      String name = “test”;
      String pwd = “test”;
      // 定义预编译sql语句
      String sql = “select from dept where name = ? and password = ?”;
      // 使用PreparedStatement对象注入预编译sql
      PreparedStatement psstmt = conn.prepareStatement(sql);
      // 设置?占位符的值
      psstmt.setString(1,name);
      psstmt.setString(2,pwd);
      // 执行sql,预编译sql不传递参数
      final ResultSet resultSet = psstmt.executeQuery();
      if (resultSet.next()) {
      System.out.println(“登录成功”);
      }else {
      System.out.println(“error”); *}