一、JDBC简介

目标

  • 了解JDBC的好处
  • 知道什么是数据库驱动

讲解

1. 什么是JDBC

  • JDBC(Java DataBase Connectivity,java数据库连接):Sun公司提供的一套规范(接口), 是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
  • JDBC相关的类和接口,都在java.sql包里

2. JDBC的好处

  • 实现了Java程序对不同数据库统一操作
  • 没有JDBC时,Java操作数据库的模式:
  • 不同数据库的API,由数据库厂商自己提供,没有统一标准
  • 需要编写不同的Java程序,来操作不同的数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cWy75fMO-1667207470166)(img/1564835142113.png)]

  • 有JDBC后,Java操作数据库的模式
  • Sun公司规定了操作数据库的统一规范:JDBC
  • 各数据库厂商在提供操作数据库的API时,都要实现JDBC规范
  • 只需要编写一套程序,就可以操作不同的数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T1TJPNfK-1667207470167)(G:/Java/web%E5%89%8D%E7%AB%AF/day15-JDBC,%E8%BF%9E%E6%8E%A5%E6%B1%A0/%E7%AC%94%E8%AE%B0/img/1564835453532.png)]

3. 数据库驱动:

  • 由数据库厂商提供的,JDBC规范的实现类,打包形成的jar包,叫数据库驱动包
  • 要操作什么数据库,就必须有什么数据库的驱动包
  • MySql的驱动包:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQP0AWgP-1667207470168)(G:/Java/web%E5%89%8D%E7%AB%AF/day15-JDBC,%E8%BF%9E%E6%8E%A5%E6%B1%A0/%E7%AC%94%E8%AE%B0/img/image-20210429214841684.png)]

小结

  • JDBC:是Sun公司提供的一套规范,是一套执行SQL语句的Java API,好处是实现了Java程序对不同数据库的统一访问
  • 要使用JDBC操作数据库,必须有:数据库驱动包

二、JDBC快速入门

目标

  • 使用jdbc执行SQL语句,查询user表的数据输出到控制台

实现

1. 准备工作

初始化数据库,建表语句如下:

drop database if exists demo;
create database demo character set utf8;
use demo;

DROP TABLE IF EXISTS USER;
CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20),
	PASSWORD VARCHAR(50),
	NAME VARCHAR(10),
	birthday DATE,
	age INT,
	sex CHAR(1)
) CHARACTER SET = utf8 COLLATE = utf8_general_ci;

INSERT INTO USER(id,username,PASSWORD,NAME,birthday,age,sex) VALUES
(NULL, 'xiaohong', 'xiaohong', '小红', '1999-09-09', 20, '男'),
(NULL, 'xiaolan', 'xiaolan', '小兰', '1997-09-09', 22, '女'),
(NULL, 'xiaolv', 'xiaolv', '小吕', '1999-09-09', 20, '女'),
(NULL, 'xiaozi', 'xiaozi', '小紫', '1999-09-09', 20, '男'),
(NULL, 'xiaoming', 'xiaoming', '小明', '1999-09-09', 20, '男');

2. JDBC步骤

  1. 导入数据库驱动jar包
  2. 编写程序
  1. 注册驱动:要操作哪种数据库,就要注册哪种数据库的驱动类
  2. 获取连接:连接上数据库
  3. 创建SQL执行平台:SQL执行平台提供了执行SQL语句的方法
  4. 执行SQL语句
  5. 处理结果
  6. 释放资源

3. 实现功能

package com.test.jdbc._01start;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * JDBC入门:可以执行SQL语句
 *      1. 注册驱动
 *      2. 获取连接
 *      3. 创建SQL执行平台
 *      4. 执行SQL
 *      5. 处理结果
 *      6. 释放资源
 */
public class Demo01JdbcStart {
    public static void main(String[] args) throws Exception {
        // 1. 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2. 获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "root");
        // 3. 创建SQL执行平台
        Statement statement = connection.createStatement();
        // 4. 执行SQL
        ResultSet resultSet = statement.executeQuery("select * from user");
        // 5. 处理结果
        while (resultSet.next()) {
            String username = resultSet.getString("username");
            String name = resultSet.getString("name");
            System.out.println(username +", " + name);
        }
        // 6. 释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

小结

三、JDBC的API详解【理解】

JDBC是一套规范,它包含了一批接口和工具类;由数据库驱动提供这些接口的实现类。JDBC的目的就是为了屏蔽不同数据库的底层操作,让开发人员只需要关注这些接口的使用,不需要关注底层具体的实现。

主要的接口和工具类有:

类名

介绍

java.sql.Driver

JDBC规定的驱动类接口

java.sql.Connection

JDBC规定的数据库连接对象接口

java.sql.Statement

JDBC规定的SQL执行平台对象接口

java.sql.ResultSet

JDBC规定的查询结果集接口

java.sql.DriverManager

JDBC提供的工具类,用于注册驱动、获取连接

1. 注册驱动

目标

  • 理解注册驱动的目的
  • 理解两种注册驱动方式的优缺点

讲解

1.1 API介绍

java.sql.DriverManager提供了静态方法,用于注册驱动

方法名

返回值

registerDriver(Driver driver)

void

1.2 注册驱动的方式
方式一:使用DriverManager注册
  • 注册的代码:DriverManager.registerDriver(new com.mysql.jdbc.Driver());
  • 有一些问题:
  • 注册了两次:我们写的这行代码会注册一次;MySql驱动类被加载时,静态代码块里也会注册一次
  • 硬编码问题:代码写死了注册的是MySql的驱动,如果换了数据库,就不得不修改Java源码
方式二:使用反射技术注册【推荐】
  • 注册的代码:Class.forName("com.mysql.jdbc.Driver")
  • 好处:
  • 只注册了一次:这行代码一执行会加载这个类,类里的静态代码块会自动注册
  • 可以解决硬编码问题:把全限定类名字符串放到配置文件里;如果换了数据库,只需要修改配置文件
1.3 示例代码
package com.test.jdbc._02api;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * API详解:注册驱动
 *  1. 如果Java程序要操作数据库,就必须要注册驱动。操作什么数据库,就要注册什么驱动
 *  2. 驱动类是什么:
 *      JDBC规定了所有数据库驱动类都必须实现的接口:java.sql.Driver
 *      MySql驱动包里会实现这个接口,实现类名称是:com.mysql.jdbc.Driver
 *      注意:
 *          MySql数据库是5.7版本
 *          MySql驱动包也使用5.x版本
 *
 *      如果:
 *          MySql数据库是8.x版本
 *          MySql驱动包也使用8.x版本
 *  3. 如何注册驱动:
 *      注册方式一【不使用这种】:JDBC提供的注册方式
 *          DriverManager.registerDriver(Driver driver);
 *          问题1:注册了两次,实际上只要注册一次就可以了
 *          问题2:硬编码问题,代码里写死了注册的是MySql的驱动,这样的话,我们的Java程序就只能操作MySql了
 *      注册方式二【使用这种】:使用反射技术注册
 *          Class.forName(String driverClassName)
 *          只注册了一次:Class.forName()方法是用于加载类,获取类的字节码
 *          可以解决硬编码问题:把驱动类名提取到配置文件里,用Java代码读取配置文件得到驱动类名
 *
 * @author liuyp
 * @date 2021/09/04
 */
public class Demo01ApiDriver {
    public static void main(String[] args) throws Exception {
        // 1. 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // DriverManager.registerDriver(new com.mysql.jdbc.Driver());


        // 2. 获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "root");
        // 3. 创建SQL执行平台
        Statement statement = connection.createStatement();
        // 4. 执行SQL
        ResultSet resultSet = statement.executeQuery("select * from user");
        // 5. 处理结果
        while (resultSet.next()) {
            String username = resultSet.getString("username");
            String name = resultSet.getString("name");
            System.out.println(username +", " + name);
        }
        // 6. 释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

小结

  • 驱动类的接口:java.sql.Driver
  • 推荐的方式
Class.forName("com.mysql.jdbc.Driver");
  • 不推荐的方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver())
  • 注册了2次
  • 存储硬编码问题:写死了只能操作MySql

2. 获取连接

目标

  • 理解获取连接的方法
  • 掌握数据库url地址的写法

讲解

2.1 API介绍

使用的是java.sql.DriverManager的方法

方法

说明

getConnection(String url, String username, String password)

获取数据库连接对象

参数:

  • url:数据库的连接地址。地址写法是由jdbc规定好的,由三部分组成,三部分之间使用:连接
  • 协议名:固定值jdbc
  • 子协议:用于声明连接的数据库是哪种类型。连接MySql写成固定值mysql
  • 具体地址:由数据库厂商自行规定的。MySql的详细地址写法:
  • 完整形式://数据库的ip:数据库的端口/database名称
  • 简写形式:///database名称, 只能用于连接本机、3306端口的MySql
  • username:数据库的帐号
  • password:数据库的密码
2.2 代码示例
package com.test.jdbc._02api;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * API详解:获取连接
 *      1. 连接对象是:接口是java.sql.Connection,实现类是什么?我们不关心
 *      2. 如何获取连接:
 *          使用JDBC的工具类DriverManager.getConnection(String url, String username, String password)
 *              参数url:数据库的地址,JDBC规定了数据库url地址的写法
 *                  由三部分组成,三部分之间使用英文冒号隔开。  协议名:子协议:具体地址
 *                  协议名:固定值jdbc
 *                  子协议:数据库的类型。如果操作MySql,子协议就是mysql
 *                  具体地址:由数据库厂商决定的写法。
 *                      MySql的具体地址写法是: //数据库ip:数据库商品/database名称
 *                      如果要连接本机默认端口: 可以简写成 ///database名称
 *              参数username:数据库的帐号
 *              参数password:数据库的密码
 */
public class Demo02ApiConnection {
    public static void main(String[] args) throws Exception {
        // 1. 注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        // 2. 获取连接
        // Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "root");
        Connection connection = DriverManager.getConnection("jdbc:mysql:///demo", "root", "root");

        // 3. 创建SQL执行平台
        Statement statement = connection.createStatement();
        // 4. 执行SQL
        ResultSet resultSet = statement.executeQuery("select * from user");
        // 5. 处理结果
        while (resultSet.next()) {
            String username = resultSet.getString("username");
            String name = resultSet.getString("name");
            System.out.println(username +", " + name);
        }
        // 6. 释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

小结

  • 数据库连接接口:java.sql.Connection
  • 获取连接的方法:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day04", "root", "root");
  • 数据库连接地址的写法:协议名:子协议:具体地址
  • 协议名:固定值jdbc
  • 子协议:如果操作的是MySql,子协议名就是mysql
  • 具体地址:由数据库厂商自行决定的写法。
  • MySql的写法://数据库ip:数据库端口/database名称
  • 如果连接本机的、默认3306端口的MySql:可以简写成///database名称