阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

JDBC简介

25次阅读
没有评论

共计 4352 个字符,预计需要花费 11 分钟才能阅读完成。

在介绍 JDBC 之前,我们先简单介绍一下关系数据库。

程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上,无论是保存到本地磁盘,还是通过网络保存到服务器上,最终都会将数据写入磁盘文件。

而如何定义数据的存储格式就是一个大问题。如果我们自己来定义存储格式,比如保存一个班级所有学生的成绩单:

名字 成绩
Michael 99
Bob 85
Bart 59
Lisa 87

你可以用一个文本文件保存,一行保存一个学生,用 , 隔开:

Michael,99
Bob,85
Bart,59
Lisa,87

你还可以用 JSON 格式保存,也是文本文件:

[
    {"name":"Michael","score":99},
    {"name":"Bob","score":85},
    {"name":"Bart","score":59},
    {"name":"Lisa","score":87}
]

你还可以定义各种保存格式,但是问题来了:

存储和读取需要自己实现,JSON 还是标准,自己定义的格式就各式各样了;

不能做快速查询,只有把数据全部读到内存中才能自己遍历,但有时候数据的大小远远超过了内存(比如蓝光电影,40GB 的数据),根本无法全部读入内存。

为了便于程序保存和读取数据,而且,能直接通过条件快速查询到指定的数据,就出现了数据库(Database)这种专门用于集中存储和查询的软件。

数据库软件诞生的历史非常久远,早在 1950 年数据库就诞生了。经历了网状数据库,层次数据库,我们现在广泛使用的关系数据库是 20 世纪 70 年代基于关系模型的基础上诞生的。

关系模型有一套复杂的数学理论,但是从概念上是十分容易理解的。举个学校的例子:

假设某个 XX 省 YY 市 ZZ 县第一实验小学有 3 个年级,要表示出这 3 个年级,可以在 Excel 中用一个表格画出来:

JDBC 简介

每个年级又有若干个班级,要把所有班级表示出来,可以在 Excel 中再画一个表格:

JDBC 简介

这两个表格有个映射关系,就是根据 Grade_ID 可以在班级表中查找到对应的所有班级:

JDBC 简介

也就是 Grade 表的每一行对应 Class 表的多行,在关系数据库中,这种基于表(Table)的一对多的关系就是关系数据库的基础。

根据某个年级的 ID 就可以查找所有班级的行,这种查询语句在关系数据库中称为 SQL 语句,可以写成:

SELECT * FROM classes WHERE grade_id = '1';

结果也是一个表:

grade_id class_id name
1 11 一年级一班
1 12 一年级二班
1 13 一年级三班

类似的,Class 表的一行记录又可以关联到 Student 表的多行记录:

JDBC 简介

由于本教程不涉及到关系数据库的详细内容,如果你想从零学习关系数据库和基本的 SQL 语句,请参考 SQL 课程。

NoSQL

你也许还听说过 NoSQL 数据库,很多 NoSQL 宣传其速度和规模远远超过关系数据库,所以很多同学觉得有了 NoSQL 是否就不需要 SQL 了呢?千万不要被他们忽悠了,连 SQL 都不明白怎么可能搞明白 NoSQL 呢?

数据库类别

既然我们要使用关系数据库,就必须选择一个关系数据库。目前广泛使用的关系数据库也就这么几种:

付费的商用数据库:

  • Oracle,典型的高富帅;
  • SQL Server,微软自家产品,Windows 定制专款;
  • DB2,IBM 的产品,听起来挺高端;
  • Sybase,曾经跟微软是好基友,后来关系破裂,现在家境惨淡。

这些数据库都是不开源而且付费的,最大的好处是花了钱出了问题可以找厂家解决,不过在 Web 的世界里,常常需要部署成千上万的数据库服务器,当然不能把大把大把的银子扔给厂家,所以,无论是 Google、Facebook,还是国内的 BAT,无一例外都选择了免费的开源数据库:

  • MySQL,大家都在用,一般错不了;
  • PostgreSQL,学术气息有点重,其实挺不错,但知名度没有 MySQL 高;
  • sqlite,嵌入式数据库,适合桌面和移动应用。

作为一个 Java 工程师,选择哪个免费数据库呢?当然是 MySQL。因为 MySQL 普及率最高,出了错,可以很容易找到解决方法。而且,围绕 MySQL 有一大堆监控和运维的工具,安装和使用很方便。

安装 MySQL

为了能继续后面的学习,你需要从 MySQL 官方网站下载并安装 MySQL Community Server,这个版本是免费的,其他高级版本是要收钱的(请放心,收钱的功能我们用不上)。MySQL 是跨平台的,选择对应的平台下载安装文件,安装即可。

安装时,MySQL 会提示输入 root 用户的口令,请务必记清楚。如果怕记不住,就把口令设置为password

在 Windows 上,安装时请选择 UTF-8 编码,以便正确地处理中文。

在 Mac 或 Linux 上,需要编辑 MySQL 的配置文件,把数据库默认的编码全部改为 UTF-8。MySQL 的配置文件默认存放在 /etc/my.cnf 或者/etc/mysql/my.cnf

[client]
default-character-set = utf8

[mysqld]
default-storage-engine = INNODB
character-set-server = utf8
collation-server = utf8_general_ci

重启 MySQL 后,可以通过 MySQL 的客户端命令行检查编码:

$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor...
...

mysql> show variables like '%char%';
+--------------------------+--------------------------------------------------------+
| Variable_name            | Value                                                  |
+--------------------------+--------------------------------------------------------+
| character_set_client     | utf8                                                   |
| character_set_connection | utf8                                                   |
| character_set_database   | utf8                                                   |
| character_set_filesystem | binary                                                 |
| character_set_results    | utf8                                                   |
| character_set_server     | utf8                                                   |
| character_set_system     | utf8                                                   |
| character_sets_dir       | /usr/local/mysql-5.1.65-osx10.6-x86_64/share/charsets/ |
+--------------------------+--------------------------------------------------------+
8 rows in set (0.00 sec)

看到 utf8 字样就表示编码设置正确。

:如果 MySQL 的版本≥5.5.3,可以把编码设置为utf8mb4utf8mb4utf8完全兼容,但它支持最新的 Unicode 标准,可以显示 emoji 字符。

JDBC

什么是 JDBC?JDBC 是 Java DataBase Connectivity 的缩写,它是 Java 程序访问数据库的标准接口。

使用 Java 程序访问数据库时,Java 代码并不是直接通过 TCP 连接去访问数据库,而是通过 JDBC 接口来访问,而 JDBC 接口则通过 JDBC 驱动来实现真正对数据库的访问。

例如,我们在 Java 代码中如果要访问 MySQL,那么必须编写代码操作 JDBC 接口。注意到 JDBC 接口是 Java 标准库自带的,所以可以直接编译。而具体的 JDBC 驱动是由数据库厂商提供的,例如,MySQL 的 JDBC 驱动由 Oracle 提供。因此,访问某个具体的数据库,我们只需要引入该厂商提供的 JDBC 驱动,就可以通过 JDBC 接口来访问,这样保证了 Java 程序编写的是一套数据库访问代码,却可以访问各种不同的数据库,因为他们都提供了标准的 JDBC 驱动:

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│  ┌───────────────┐  │
   │   Java App    │
│  └───────────────┘  │
           │
│          ▼          │
   ┌───────────────┐
│  │JDBC Interface │◀─┼─── JDK
   └───────────────┘
│          │          │
           ▼
│  ┌───────────────┐  │
   │  JDBC Driver  │◀───── Vendor
│  └───────────────┘  │
           │
└ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ┘
           ▼
   ┌───────────────┐
   │   Database    │
   └───────────────┘

从代码来看,Java 标准库自带的 JDBC 接口其实就是定义了一组接口,而某个具体的 JDBC 驱动其实就是实现了这些接口的类:

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│  ┌───────────────┐  │
   │   Java App    │
│  └───────────────┘  │
           │
│          ▼          │
   ┌───────────────┐
│  │JDBC Interface │◀─┼─── JDK
   └───────────────┘
│          │          │
           ▼
│  ┌───────────────┐  │
   │ MySQL Driver  │◀───── Oracle
│  └───────────────┘  │
           │
└ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ┘
           ▼
   ┌───────────────┐
   │     MySQL     │
   └───────────────┘

实际上,一个 MySQL 的 JDBC 的驱动就是一个 jar 包,它本身也是纯 Java 编写的。我们自己编写的代码只需要引用 Java 标准库提供的 java.sql 包下面的相关接口,由此再间接地通过 MySQL 驱动的 jar 包通过网络访问 MySQL 服务器,所有复杂的网络通讯都被封装到 JDBC 驱动中,因此,Java 程序本身只需要引入一个 MySQL 驱动的 jar 包就可以正常访问 MySQL 服务器:

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
   ┌───────────────┐
│  │   App.class   │  │
   └───────────────┘
│          │          │
           ▼
│  ┌───────────────┐  │
   │  java.sql.*   │
│  └───────────────┘  │
           │
│          ▼          │
   ┌───────────────┐     TCP    ┌───────────────┐
│  │ mysql-xxx.jar │──┼────────▶│     MySQL     │
   └───────────────┘            └───────────────┘
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
          JVM

小结

使用 JDBC 的好处是:

  • 各数据库厂商使用相同的接口,Java 代码不需要针对不同数据库分别开发;
  • Java 程序编译期仅依赖 java.sql 包,不依赖具体数据库的 jar 包;
  • 可随时替换底层数据库,访问数据库的 Java 代码基本不变。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计4352字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中