一、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步骤
- 导入数据库驱动jar包
- 编写程序
- 注册驱动:要操作哪种数据库,就要注册哪种数据库的驱动类
- 获取连接:连接上数据库
- 创建SQL执行平台:SQL执行平台提供了执行SQL语句的方法
- 执行SQL语句
- 处理结果
- 释放资源
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的目的就是为了屏蔽不同数据库的底层操作,让开发人员只需要关注这些接口的使用,不需要关注底层具体的实现。
主要的接口和工具类有:
类名 | 介绍 |
| JDBC规定的驱动类接口 |
| JDBC规定的数据库连接对象接口 |
| JDBC规定的SQL执行平台对象接口 |
| JDBC规定的查询结果集接口 |
| JDBC提供的工具类,用于注册驱动、获取连接 |
1. 注册驱动
目标
- 理解注册驱动的目的
- 理解两种注册驱动方式的优缺点
讲解
1.1 API介绍
java.sql.DriverManager
提供了静态方法,用于注册驱动
方法名 | 返回值 |
|
|
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
的方法
方法 | 说明 |
| 获取数据库连接对象 |
参数:
- 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名称