• JDBC 的使用


    JDBC 的使用

    步骤

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qYWFdOWx-1662551888674)(C:\Users\zzz\AppData\Roaming\Typora\typora-user-images\image-20220907110818498.png)]

    代码
    package com.itheima.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    
    public class JDBCDemo {
        public static void main(String[] args) throws Exception {
            // 1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
    
            // 2. 获取连接
            String url="jdbc:mysql://127.0.0.1:3306/itheima";
            String username="root";
            String password="123456";
            Connection conn = DriverManager.getConnection(url,username,password);
    
            // 3. 定义sql
            String sql="update account set money=2000 where id=1";
    
            // 4. 获取执行sql的对象
            Statement stmt=conn.createStatement();
    
            // 5. 执行sql
            int count=stmt.executeUpdate(sql); // 受影响的行数返回值
    
            // 6. 处理结果
            System.out.println(count);
    
            // 7. 释放资源
            stmt.close();
            conn.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    JDBC API 详解

    1. DriverManager

    DriverManager(驱动管理类)作用:

    1. 注册驱动
    2. 获取数据库连接

    ① 注册驱动

    Class.forName("com.mysql.jdbc.Driver");
    
    • 1

    注意:Mysql 5之后的驱动包,可以省略注册驱动的步骤;

    自动加载jar包中META-INF/services/java.sql.Driver 文件中的驱动类

    ② 获取连接

    static Connection          getConnection(String url,String user,String password)
    
    • 1
    • 参数

      • url:连接路径

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-djKC2778-1662551888675)(C:\Users\zzz\AppData\Roaming\Typora\typora-user-images\image-20220907112353790.png)]

      • user:用户名

      • password:密码

    2. Connection

    Connection(数据库连接对象)作用:

    1. 获取执行 SQL 的对象
    2. 管理事务

    ① 获取执行 SQL 的对象

    • 普通执行 SQL 对象

      Statement createStatement();
      
      • 1
    • 预编译 SQL 的执行 SQL 对象:防止 SQL 注入

      PreparedStatement prepareStatement(sql);
      
      • 1
    • 执行存储过程的对象

      CallableStatement prepareCall(sql)
      
      • 1

    ② 事务管理

    • MySQL 事务管理

      开启事务:BEGIN; /START TRANSACTION;
      提交事务:COMMIT;
      回滚事务:ROLLBACK;
      
      MySQL 默认会自动提交事务
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • JDBC 事务管理:Connection 接口中定义了3个对应的方法

      开启事务:setAutoCommit(boolean autoCommit)true 为自动提交事务;false 为手动提交事务,即为开启事务
      提交事务:commit()
      回滚事务:rollback()
      
      • 1
      • 2
      • 3
      • 4
    代码
    package com.itheima.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class JDBCDemo {
        public static void main(String[] args) throws Exception {
            // 1. 注册驱动
    		// Class.forName("com.mysql.jdbc.Driver");
    
            // 2. 获取连接
            String url="jdbc:mysql:///itheima?useSSL=false";
            String username="root";
            String password="123456";
            Connection conn = DriverManager.getConnection(url,username,password);
    
            // 3. 定义sql
            String sql1="update account set money=3000 where id=1";
            String sql2="update account set money=4000 where id=2";
    
            // 4. 获取执行sql的对象
            Statement stmt=conn.createStatement();
    
            // 异常处理
            try {
                // 开启事务
                conn.setAutoCommit(false);
                
                // 5.1 执行sql
                int count1=stmt.executeUpdate(sql1); // 受影响的行数返回值
    
                // 6.1 处理结果
                System.out.println(count1);
    
                // 5.2 执行sql
                int count2=stmt.executeUpdate(sql2); // 受影响的行数返回值
    
                // 6.2 处理结果
                System.out.println(count2);
                
                // 提交事务
                conn.commit();
            } catch (Exception e) {
                // 回滚事务
                conn.rollback();
                
                e.printStackTrace();
            }
    
            // 7. 释放资源
            stmt.close();
            conn.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    3. Statement

    Statement 作用:

    1. 执行 SQL 语句
    执行 SQL 语句
    int executeUpdate(sql):执行 DML、DDL 语句
    
    • 1

    返回值:(1)DML 语句影响的行数

    ​ (2)DDL 语句执行后,执行成功也可能返回 0

    ResultSet executeQuery(sql):执行 DQL 语句
    
    • 1

    返回值:ResultSet 结果集对象

    4. ResultSet

    ResultSet(结果集对象)作用:

    1. 封装了 DQL 查询语句的结果
    ResultSet stmt.executeQuery(sql):执行 DQL 语句,返回 ResultSet 对象
    
    • 1
    获取查询结果
    boolean next()
    (1) 将光标从当前位置向前移动一位
    (2) 判断当前行是否为有效行
    
    • 1
    • 2
    • 3

    返回值:

    • true:有效行,当前行有数据

    • false:无效行,当前行没有数据

    xxx getXxx(参数):获取数据
    xxx:数据类型;如:int getInt(参数)String getString(参数)
    
    • 1
    • 2

    参数:

    • int:列的编号,从1开始
    • String:列的名称
    使用步骤
    1. 游标向下移动一行,并判断该行是否有数据:next()
    2. 获取数据:getXxx(参数)
    // 循环判断游标是否是最后一行末尾
    while(rs.next()){
    	// 获取数据
    	rs.getXxx(参数);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    代码
    package com.itheima.jdbc;
    
    import javax.swing.plaf.nimbus.State;
    import java.sql.*;
    
    public class JDBCDemo {
        public static void main(String[] args) throws Exception {
            // 1. 注册驱动
            // Class.forName("com.mysql.jdbc.Driver");
    
            // 2. 获取连接
            String url="jdbc:mysql:///itheima?useSSL=false";
            String username="root";
            String password="123456";
            Connection conn = DriverManager.getConnection(url,username,password);
    
            // 3. 定义sql
            String sql="select * from account";
    
            // 4. 获取 Statement 对象
            Statement stmt=conn.createStatement();
    
            // 5. 执行sql
            ResultSet rs=stmt.executeQuery(sql);
    
            // 6. 处理结果,遍历 rs 中的所有数据
            // 6.1 光标向下移动一行,并且判断当前行是否有数据
            while(rs.next()){
                // 6.2 获取数据 getXxx()
                int id=rs.getInt(1); // 1 表示第1列
                String name=rs.getString(2);
                double money=rs.getDouble(3);
    
                System.out.println(id);
                System.out.println(name);
                System.out.println(money);
    
                System.out.println("--------------------------------");
            }
    
            // 7. 释放资源
            rs.close();
            stmt.close();
            conn.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    案例:查询account账户表数据,封装为Acount对象中,并且存储到ArrayList集合中

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4uBY71M-1662551888675)(C:\Users\zzz\AppData\Roaming\Typora\typora-user-images\image-20220907140220950.png)]

    步骤:

    1. 定义实体类 Account
    2. 查询数据库,封装到 Account 对象中
    3. 将 Account 对象存入 ArrayList 集合中

    实体类 Account

    package com.itheima.pojo;
    
    public class Account {
    
        private int id;
        private String name;
        private double money;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public double getMoney() {
            return money;
        }
    
        public void setMoney(double money) {
            this.money = money;
        }
    
        @Override
        public String toString() {
            return "Account{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", money=" + money +
                    '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    主函数

    package com.itheima.jdbc;
    
    import com.itheima.pojo.Account;
    
    import javax.swing.plaf.nimbus.State;
    import java.sql.*;
    import java.util.ArrayList;
    import java.util.List;
    
    public class JDBCDemo {
        public static void main(String[] args) throws Exception {
            // 1. 注册驱动
            // Class.forName("com.mysql.jdbc.Driver");
    
            // 2. 获取连接
            String url="jdbc:mysql:///itheima?useSSL=false";
            String username="root";
            String password="123456";
            Connection conn = DriverManager.getConnection(url,username,password);
    
            // 3. 定义sql
            String sql="select * from account";
    
            // 4. 获取 Statement 对象
            Statement stmt=conn.createStatement();
    
            // 5. 执行sql
            ResultSet rs=stmt.executeQuery(sql);
    
            // 创建集合 ArrayList
            List<Account> list=new ArrayList<>();
    
            // 6. 处理结果,遍历 rs 中的所有数据
            // 6.1 光标向下移动一行,并且判断当前行是否有数据
            while(rs.next()){
                // 创建对象
                Account account=new Account();
    
                // 6.2 获取数据 getXxx()
                int id=rs.getInt("id"); // 1 表示第1列
                String name=rs.getString("name");
                double money=rs.getDouble("money");
    
                // 赋值
                account.setId(id);
                account.setName(name);
                account.setMoney(money);
    
                // 存入集合
                list.add(account);
    
            }
    
            System.out.println(list);
    
            // 7. 释放资源
            rs.close();
            stmt.close();
            conn.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    5. PreparedStatement

    PreparedStatement 作用:

    1. 预编译 SQL 语句并执行:预防 SQL 注入问题

    SQL 注入:

    SQL 注入是通过操作输入来修改事先定义好的 SQL 语句,用以达到执行代码对服务器进行攻击的方法

    ① 获取 PreparedStatement 对象

    // SQL 语句中的参数值,使用 ? 占位符替代
    String sql="select * from user where username=? and password=?"
    
    // 通过 Connection 对象获取,并传入对应的 sql 语句
    PreparedStatement pstmt=conn.preparedStatement(sql);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ② 设置参数值

    PreparedStatement 对象:setXxx(参数1,参数2):? 赋值
    Xxx:数据类型;如 setInt(参数1,参数2)
    参数:
    	- 参数1? 的位置编号,从1开始
    	- 参数2:?的值
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ③ 执行 SQL

    executeUpdate(); / executeQuery();  :不需要再传递 sql
    
    • 1

    SQL 注入是通过操作输入来修改事先定义好的 SQL 语句,用以达到执行代码对服务器进行攻击的方法

    ① 获取 PreparedStatement 对象

    // SQL 语句中的参数值,使用 ? 占位符替代
    String sql="select * from user where username=? and password=?"
    
    // 通过 Connection 对象获取,并传入对应的 sql 语句
    PreparedStatement pstmt=conn.preparedStatement(sql);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ② 设置参数值

    PreparedStatement 对象:setXxx(参数1,参数2):? 赋值
    Xxx:数据类型;如 setInt(参数1,参数2)
    参数:
    	- 参数1? 的位置编号,从1开始
    	- 参数2:?的值
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ③ 执行 SQL

    executeUpdate(); / executeQuery();  :不需要再传递 sql
    
    • 1
    PreparedStatement 原理

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AxuXjlUt-1662551888676)(C:\Users\zzz\AppData\Roaming\Typora\typora-user-images\image-20220907195702337.png)]

  • 相关阅读:
    剑指 Offer II 114+115+116+117+LC827
    linux0.11 源码阅读 head.s setup.s bootsect.s加载位置
    Python源码剖析3-列表对象PyListObject
    “目标检测”任务基础认识
    oracle 执行计划查看常用sql
    家庭房产(PTA)
    【Jenkins】Jenkins构建前端流水线
    “行泊一体”的火爆与现实困境
    一文梳理SpringCloud常见知识点
    PPPoE连接无法建立的排查和修复
  • 原文地址:https://blog.csdn.net/weixin_49915090/article/details/126752758