• 【JavaWeb】-JDBC详解、数据库连接池的认识


    作者:学Java的冬瓜

    博客主页:☀冬瓜的主页🌙

    专栏:【Java Web】

    分享:我沐浴过神河文明的光芒,它指引我成为一名战士,如有战死沙场之日,我愿化作银河里的星辰,为你们照亮前路。——《雄兵连》

    主要内容:认识JDBC、用JDBC连接数据库并执行SQL语句、常用API的学习、数据库连接池

    在这里插入图片描述

    一、认识JDBC

    1、JDBC概念

    • JDBC是使用Java语言操作关系型数据库的一套API
    • 全称:(Java Database Connectivity) Java数据库连接

    2、JDBC本质

    • 官方(sun公司)定义的一套操作所有关系型数据库的接口。
    • 数据库厂商要提供数据库驱动 jar 包(去相应的数据库厂商官网下载),自己去做实现这套接口的类。
    • 我们利用这套接口进行编程,真正执行代码的是jar包中的实现这套接口的类。

    3、图片解析

    在这里插入图片描述

    4、JDBC优点

    • 各数据库厂商使用相同的接口,Java代码不需要根据不同数据库单独开发
    • 可随时替换底层数据库,访问数据库的Java代码基本不变。

    二、JDBC连接数据库并执行SQL语句

    1、代码

    public class JDBC {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //1、注册驱动
            Class.forName("com.mysql.jdbc.Driver");
    
            //2、获取连接
            String url = "jdbc:mysql://127.0.0.1:3306/itcase";
            String userName = "root";
            String passWord = "202111a.";
            Connection conn = DriverManager.getConnection(url,userName,passWord);
    
            //3、定义SQL语句
            String sql = "update user set age = 19 where id = 1";
    
            //4、获取执行SQL对象
            Statement stmt = conn.createStatement();
    
            //5、执行SQL,并返回结果(影响行数)
            int count = stmt.executeUpdate(sql);
    
            //6、处理返回结果
            System.out.println(count);
    
            //7、释放资源
            conn.close();
            stmt.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

    2、步骤

    1. 创建工程,导入jar包
    2. 注册驱动
    3. 获取连接
    4. 定义SQL语句
    5. 获取要执行的SQL对象
    6. 执行SQL
    7. 处理返回结果
    8. 释放资源

    第O 步

    创建工程,导入jar包

    • 创建一个Java工程,在工程里建一个包如 lib,用来存放jar包。
    • 复制jar包,然后粘贴到lib包下
      在这里插入图片描述
    • jar包去相应数据库官网下载(我这里下的是数据库的8.0.28版本,注意要和MySQL版本对应)。
    • 我这里是下载jar包并解压后单独保存在了D盘,JDBC文件夹下Mysql驱动包里

    在这里插入图片描述

    第一步

    注册驱动

    • 关键语句:Class.forName(“com.mysql.jdbc.Driver”);,其中com.mysql.jdbc.Driver就是各数据库厂商实现JDBC接口的驱动类。
    • 使用这个语句后,jvm会加载这个类,然后进入com.mysql.jdbc.Driver,会立即注册
    • 进入java.sql.DriverManager,DriverManager管理器会调用注册方法,并把Driver放入registeredDrivers列表中:
    	// Register ourselves with the DriverManager
    	static {
    		try {
    			java.sql.DriverManager.registerDriver(new Driver());
    		} catch (SQLException E) {
    			throw new RuntimeException("Can't register driver!");
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • MySQL 5 之后,可以忽略注册的步骤。
    • 导入jar包后程序会自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类。

    在这里插入图片描述

    第二步

    获取连接

    • 关键语句
      String url = “jdbc:mysql://127.0.0.1:3306/itcas”; //127.0.0.1是IP地址(域名),3306是端口号,itcase是要连接的数据库
      String userName = “root”; //用户名
      String passWord = “202111a.”; //密码

    • 关键语句
      Connection conn = DriverManager.getConnection(url,userName,passWord);

    利用DriverManager API连接数据库,使用Cnonection接收,因为DriverManager的getConnection方法返回值是Cnonection类型。

    在这里插入图片描述

    • 如果连接本机的MySQL且端口是默认端口3306,可以省略域名和端口名,简化成:“jdbc:mysql:///itcase”
    • 数据库名之后,可以跟参数键值对,键值对之间用&连接
    拓展:DriverManager API

    1>、注册驱动在这里插入图片描述

    2>、获取连接

    第三步

    定义SQL语句

    • 关键语句
      String sql = “update user set age = 19 where id = 1”; //我这里用了一个更新操作,把在itcase数据库user表里,id为1的年龄改为19。

    itcase里放着的user表:
    在这里插入图片描述

    第四步

    获取要执行SQL对象

    • 关键语句
      Statement stmt = conn.createStatement();
    拓展I:Connection API

    1>、获取执行SQL对象
    2>、管理事务

    在这里插入图片描述
    在这里插入图片描述

    拓展II:PreparedStatement API

    预编译接近SQL注入问题:

    1>、SQL注入:
    概念:通过操作输入来修改事先定义好的SQL语句,用以执行代码对服务器进行攻击的方法。

    @ 准备:在itcase数据库中创建stu表,存放用户名和姓名,并插入数据:

    //进入itcase数据库
    use itcase;
    //建表stu
    create table stu(
    username char(20),
    password char(20)
    );
    //插入
    insert stu values('zhangsan','123'),('lisi','1234');
    //查询
    select * from stu;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    @ SQL注入核心代码:
    注意:SQL注入,输入用户名任意,输入特殊的密码就会可以登录成功 如:

    String pwd = "' or '1' = '1";
    
    • 1
    //接收用户输入用户名和密码
    String name = "abc";
    String pwd = "' or '1' = '1";
    
    String sql = "select * from stu where username = '"+name+"' and password = '"+pwd+"'";
    
    //获取对象
    Statement stmt = conn.createStatement();
    //执行SQL
    ResultSet rs = stmt.executeQuery(sql);
    //判断登录是否成功
    if(rs.next()){
        System.out.println("登录成功");
    }else {
        System.out.println("登陆失败");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    @ 分析
    在这里插入图片描述
    2>、PreparedStatement解决SQL注入

    @ 核心代码

    思想:
    1、利用占位符?先把坑占好
    2、再调用Connection下的preparedStatement方法进行预编译
    3、然后再设置参数
    4、最后执行SQL语句。

    String sql = "select * from stu where username = ? and password = ?"; //?表示占位符
    //获取pstmt对象
    PreparedStatement pstmt = conn.prepareStatement(sql); //预编译
    pstmt.setString(1,name);
    pstmt.setString(2,password);  //设置参数
    
    ResultSet rs = pstmt.executeQuery();//执行SQL,这里不再传参
    
    if(rs.next()){   //判断登录是否成功
        System.out.println("登录成功");
    }else {
        System.out.println("登陆失败");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3>、PreparedStatement防止SQL注入的原理
    在这里插入图片描述
    @ 对无法SQL注入的解释:

    使用SQL注入的特殊密码时:String pwd = "' or '1' = '1";
    在预编译完,设置参数时,会将单引号转义为'' \ ' ''。
    所以,不会再出现凑字符串去登录的情况。
    
    • 1
    • 2
    • 3

    第五步

    执行SQL,并返回结果(影响行数)
    关键语句:
    int count = stmt.executeUpdate(sql); //count是SQL语句执行数据库后,返回的影响行数

    第六步

    处理返回结果

    拓展:Statement API

    在这里插入图片描述

    1>、处理第五步中,Statement的executeUpdate(sql)方法返回值:

    这个处理方法符合DML语句,但DDL语句不行。比如删除数据库,或一个表。对于DDL语句只要没有报错,就相当于执行成功了。

    if(count > 0){
        System.out.println("修改成功!");
    }else {
        System.out.println("修改失败!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2>、第五步中,Statement的executeQuery(sql)方法,处理返回值ResultSet:结果集

    认识ResultSet结果集:
    在这里插入图片描述
    处理方法:
    在这里插入图片描述
    代码:

    //连接
    String url = "jdbc:mysql://127.0.0.1:3306/itcase? ";
    String userName = "root";
    String passWord = "202111a.";
    Connection conn = DriverManager.getConnection(url,userName,passWord);
    //定义SQL,获取执行对象,接收查询结果
    String sql = "select * from user";
    Statement stmt = conn.createStatement();
    ResultSet resultSet = stmt.executeQuery(sql);
    
    //6、处理返回结果
    while (resultSet.next()){
        String id = resultSet.getString(1);//1可以用"id"代替,其它也一样
        String name = resultSet.getString(2);
        int age = resultSet.getInt(3);
    
        System.out.println("id:"+id+" name:"+name+" age:"+age);
        System.out.println("************************");
    }
    
    
    结果:
    id:1 name:zhang age:19
    ************************
    id:2 name:li age:20
    ************************
    
    • 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
    拓展:ResultSet API(结果集)

    需求:查询user表的id、name、age数据,封装到User对象中,并存储到ArrayList中

    步骤
    1》创建一个pojo包,包里创建User类,User类有id、name、age三个字段,设置set方法和toString方法。
    在这里插入图片描述
    User类:
    在这里插入图片描述

    2》查询数据,封装到User对象中
    3》将User对象存到ArrayList集合中,并输出

    List<User> list = new ArrayList<>();
     //6、处理返回结果
     while (resultSet.next()){
         User user = new User();
         String id = resultSet.getString(1);
         String name = resultSet.getString(2);
         int age = resultSet.getInt(3);
    
         //给对象赋值
         user.setId(id);
         user.setName(name);
         user.setAge(age);
    
         //把对象存储到list集合
         list.add(user);
     }
     System.out.println(list);
    
    结果:
    [User{id='1', name='zhang', age=19}, User{id='2', name='li', age=20}]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    第七步

    释放资源
    关键语句:
    conn.close();
    stmt.close(); //这两行都是回收资源

    3、结果

    修改前:
    在这里插入图片描述
    修改后:

    注:执行 “update user set age = 19 where id = 1”
    SQL语句后,把id为1的age=17改为了age=19。

    在这里插入图片描述

    三、数据库连接池

    1、认识数据库连接池

    在这里插入图片描述

    2、连接池Druid的使用

    在这里插入图片描述

    @ 实现步骤

    说明:具体操作找黑马JavaWeb视频

    在这里插入图片描述

  • 相关阅读:
    2022.11.30-----leetcode.895
    框架安全-CVE 复现&Spring&Struts&Laravel&ThinkPHP漏洞复现
    【附源码】计算机毕业设计SSM石家庄学院跳蚤市场
    微信自动化工具开发系列01_自动获取微信聊天信息(2022年7月可用)
    SAP GUI 8.0 SMARTFORMS 使用SCR LEGACY TEXT EDITOR GUI8.00 禁用MSWORD
    科学数据中心资源和用户访问控制体系
    基础生态学终结版复习题
    R语言隐马尔可夫模型HMM识别股市变化分析报告
    神经网络遗传算法函数极值寻优
    外汇天眼:SEC起诉“现金流之王”播客主持人涉嫌1100万美元庞氏骗局
  • 原文地址:https://blog.csdn.net/m0_63979882/article/details/127629338