什么是 JDBC
# 00.什么是 JDBC
Java 为关系数据库定义了一套标准的访问接口:JDBC(Java Database Connectivity),本章我们介绍如何在 Java 程序中使用 JDBC。
本文只讲解 JDBC 技术,读者应了解什么是数据库和 MySQL 后再来学习,并提前安装好 MySQL。
# JDBC 介绍
什么是 JDBC?JDBC 是 Java DataBase Connectivity 的缩写,它是 Java 程序访问数据库的标准接口。注意,只是接口而已,并没有具体的实现类。
使用 Java 程序访问数据库时,Java 代码并不是直接通过 TCP 连接去访问数据库,而是通过 JDBC 接口来访问,而 JDBC 接口则通过 JDBC 驱动来实现真正对数据库的访问。
为什么要这样做呢?首先数据库产品有很多,例如 MySQL,Oracle,DB2....等等,而且连接方式都各有差异;为此,Java 直接定义了一套接口,然后各个数据库厂商分别实现这个接口,并提供 jar 包(也叫 JDBC 驱动),这样我们就可以直接使用一套代码,连接不同的数据库产品。
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
│ ┌───────────────┐ │
│ Java App │
│ └───────────────┘ │
│
│ ▼ │
┌───────────────┐
│ │JDBC Interface │←─┼─── JDK
└───────────────┘
│ │ │
▼
│ ┌───────────────┐ │
│ MySQL Driver │←───── Oracle
│ └───────────────┘ │
│
└ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ┘
▼
┌───────────────┐
│ MySQL │
└───────────────┘
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
一个 MySQL 的 JDBC 的驱动就是一个 jar 包,它本身也是纯 Java 编写的。我们自己编写的业务代码只需要引用 Java 标准库提供的 java.sql 包下面的相关接口,由此再间接地通过 MySQL 驱动的 jar 包通过网络访问 MySQL 服务器,所有复杂的网络通讯都被封装到 JDBC 驱动中,因此,Java 程序本身只需要引入一个 MySQL 驱动的 jar 包就可以正常访问 MySQL 服务器。
使用 JDBC 的好处
- 各数据库厂商使用相同的接口,Java 代码不需要针对不同数据库分别开发,使用一套 Java 代码就可以操作所有的关系型数据库。
- Java 程序编译期仅依赖 java.sql 包,不依赖具体数据库的 jar 包;
- 可随时替换底层数据库,访问数据库的 Java 代码基本不变。
# 使用 JDBC 的好处
- 各数据库厂商使用相同的接口,Java 代码不需要针对不同数据库分别开发,使用一套 Java 代码就可以操作所有的关系型数据库。
- Java 程序编译期仅依赖 java.sql 包,不依赖具体数据库的 jar 包;
- 可随时替换底层数据库,访问数据库的 Java 代码基本不变。
# 数据库准备
为了后续的学习,需要准备一点数据。这里我们用一个脚本创建数据库和表,然后插入一些数据:
-- 创建数据库learjdbc:
DROP DATABASE IF EXISTS learnjdbc;
CREATE DATABASE learnjdbc;
-- 创建登录用户learn/口令learnpassword
CREATE USER IF NOT EXISTS learn@'%' IDENTIFIED BY 'learnpassword';
GRANT ALL PRIVILEGES ON learnjdbc.* TO learn@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
-- 创建表students:
USE learnjdbc;
CREATE TABLE students (
id BIGINT AUTO_INCREMENT NOT NULL,
name VARCHAR(50) NOT NULL,
gender TINYINT(1) NOT NULL,
grade INT NOT NULL,
score INT NOT NULL,
PRIMARY KEY(id)
) Engine=INNODB DEFAULT CHARSET=UTF8;
-- 插入初始数据:
INSERT INTO students (name, gender, grade, score) VALUES ('小明', 1, 1, 88);
INSERT INTO students (name, gender, grade, score) VALUES ('小红', 1, 1, 95);
INSERT INTO students (name, gender, grade, score) VALUES ('小军', 0, 1, 93);
INSERT INTO students (name, gender, grade, score) VALUES ('小白', 0, 1, 100);
INSERT INTO students (name, gender, grade, score) VALUES ('小牛', 1, 2, 96);
INSERT INTO students (name, gender, grade, score) VALUES ('小兵', 1, 2, 99);
INSERT INTO students (name, gender, grade, score) VALUES ('小强', 0, 2, 86);
INSERT INTO students (name, gender, grade, score) VALUES ('小乔', 0, 2, 79);
INSERT INTO students (name, gender, grade, score) VALUES ('小青', 1, 3, 85);
INSERT INTO students (name, gender, grade, score) VALUES ('小王', 1, 3, 90);
INSERT INTO students (name, gender, grade, score) VALUES ('小林', 0, 3, 91);
INSERT INTO students (name, gender, grade, score) VALUES ('小贝', 0, 3, 77);
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
在控制台输入 mysql -u root -p
,输入 root
口令后以 root
身份,把上述 SQL 贴到控制台执行一遍就行。如果你运行的是最新版 MySQL 8.x,需要调整一下 CREATE USER
语句。
# 下载依赖
前面我们讲了 Java 程序要通过 JDBC 接口来查询数据库。JDBC 是一套接口规范,它在哪呢?就在 Java 的标准库 java.sql
里放着,不过这里面大部分都是接口。接口并不能直接实例化,而是必须实例化对应的实现类,然后通过接口引用这个实例。那么问题来了:JDBC 接口的实现类在哪?
因为 JDBC 接口并不知道我们要使用哪个数据库,所以,用哪个数据库,我们就去使用哪个数据库的“实现类”,我们把某个数据库实现了 JDBC 接口的 jar 包称为 JDBC 驱动。
因为我们选择了 MySQL 5.x 作为数据库,所以我们首先得找一个 MySQL 的 JDBC 驱动。所谓 JDBC 驱动,其实就是一个第三方 jar 包。
可以从我的 GitHub 仓库里下载 jar 包(mysql-connector-java-8.0.27.jar):
Gitee:lib · /LearnJavaEE - Gitee (opens new window)
GitHub:LearnJavaEE/lib at master · Peter-JXL/LearnJavaEE (opens new window)
我们可以去一个叫做 Maven 仓库的地方下载:Maven Repository: mysql » mysql-connector-java » 8.0.27 (opens new window)
下载后,记得添加到 IDE 的依赖。
如果你会 Maven,可以这样添加依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
2
3
4
5
6
注意到这里添加依赖的 scope
是 runtime
,因为编译 Java 程序并不需要 MySQL 的这个 jar 包,只有在运行期才需要使用。
如果把 runtime
改成 compile
,虽然也能正常编译,但是在 IDE 里写程序的时候,会多出来一大堆类似 com.mysql.jdbc.Connection
这样的类,非常容易与 Java 标准库的 JDBC 接口混淆,所以坚决不要设置为 compile
。
# 总结
JDBC 本质:其实是官方(sun 公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动 jar 包。开发者可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类。
举个例子,我们定义一个 Person 接口,然后 Worker 实现这个接口:
Person p = new Worker();
p.eat();
2
上面我们用 Person 类型接受了 worker 类型的变量,在执行具体的方法的时候,执行的是 Worker 类型里的方法。
JDBC 也是一样的,JDBC 只定义了一套接口,具体实现类由各个数据库厂商实现,调用方法的时候也是调用具体实现类的方法。