龙空技术网

我的Java Web之路43 - 数据库

普通的码农 134

前言:

而今我们对“数据库java”可能比较讲究,小伙伴们都需要剖析一些“数据库java”的相关知识。那么小编同时在网摘上收集了一些对于“数据库java””的相关文章,希望兄弟们能喜欢,各位老铁们快快来了解一下吧!

目录介绍什么是数据库(database、DB)数据库的种类关系数据库结构化查询语言(SQL)总结介绍

前面我们已经把租房网改造成使用Spring MVC和Spring IoC了(参考这篇文章),但比较大的不足是仍然使用模拟的房源数据,这些数据都是在内存中初始化并存储的。

而内存属于易失性存储介质,即一旦断电数据就会消失,在这个数据为王的时代里,这当然是不能容忍的。

所以,我们要把数据存储在非易失性(或者永久性)存储介质里,这其实也就是数据的持久化问题。

非易失性(或者永久性)存储设备有软盘、硬盘(即机械硬盘,或就叫磁盘)、固态硬盘、光盘、U盘等等。目前一般个人电脑和服务器上配置的用来存储大容量数据的都是机械硬盘,不过固态硬盘也越来越流行。

到目前为止,我们也已经介绍了Web前端三剑客(HTML、CSS、JavaScript)中的HTML(可以参考这篇文章和这篇文章),也使用了Web后端四剑客(Web服务器、数据库、缓存、消息队列)中的Web服务器(Tomcat也是一个Web服务器)。

本篇文章及后面的文章我们就介绍一下Web后端四剑客中的数据库。

什么是数据库(database、DB)

可以这么说,数据库技术就是为了解决数据的持久化问题的技术。从这个角度讲,文件系统也算是一个数据库技术。

目前又有内存数据库这样的新概念,本质上不应该叫数据库,因为既然叫数据库,即数据的仓库,至少在相当一段时间内不应该消失啊,而内存中的数据一旦掉电即消失,而掉电这种事情发生的概率还是蛮大的。

但一般理解上,数据库是一个能够快速的往存储设备中存储(即增加或者插入)大量(多大?)数据,并保证数据能够正确、快速的访问(包括读取和更新)的东西。所以,存储设备当然属于数据库的一部分。

而存储设备中存放的数据(就目前计算机技术上看,本质上都是二进制数据)更是数据库的一部分。不过,数据库里的数据一定是按照某种规则存储的,否则就这些数据就没有意义了。

而保证数据快速的插入存储设备、并从存储设备正确、快速访问的东西就是一个程序/软件,我们叫它为数据库管理系统(DBMS)。当然,必须把数据库管理系统运行起来才能使用,否则它只是一堆死的供CPU执行的指令而已。

有了数据库管理系统,我们就可以使用它来快速的管理我们的数据了。一般情况下,数据库管理系统都会提供各种各样的工具,最简单的就是对数据的增、删、改、查,还有就是备份、恢复、扩容等等。

当然,数据库管理系统不仅为人类提供了各种(对人类友好的)工具,还提供为机器提供了(对机器友好的)各种各样的数据库编程接口。这样,我们就可以使用这些接口来编写我们的应用程序,让它们自动的去使用/访问数据库中的数据。

数据库的种类

事实上,你可以用各种介质来存储数据,比如古时候的结绳记事、甲骨、动植物的皮、竹简、丝绸等,到现在也没有消失的纸。

拿纸介质来说,你也可以将我们的数据,比如各种财务数据、商品数据、客户数据、交易数据等等,按照一定规则记录在纸上,那么,这也算是一种原始的数据库了,只不过这种纸质数据库都需要人工来管理,效率是低的可怜。

而计算机出现之后,我们就可以编写好程序(数据库管理系统),让CPU去执行(访问存储设备),这样就实现了自动去管理数据。它们都是电子化数据库。

所以说,文件系统也算是一种数据库了,因为你当然可以把各种数据按一定规则存为文件啊。但文件系统在支持多用户高并发访问、快速检索数据、保证数据一致性等方面都有很大缺陷。

后来数据库又经历了层次数据库、网状数据库、关系数据库、到现在流行的NoSQL数据库等阶段。

NoSQL数据库实际上就是非关系数据库的统称:

键值对存储(key-value):代表软件Redis列存储:代表软件Hbase文档数据库存储:代表软件MongoDB图形数据库存储:代表软件InfoGrid

所有这些种类的数据库都有自己的数据组织规则和存储规则。

关系数据库

从目前来看,关系数据库应该算是最经典、最强大、最重要的一种数据库了,就算在NoSQL很火的时代,它也仍然占据相当重要的位置。

我们后面也是拿这种数据库来演示和应用。

不过,关系数据库实在太多了,不管是商用的还是开源的,Oracle、DB2、SQL Server、Sybase、MySQL、PostgreSQL、SQLite、H2Database、Derby、HyperSQL等等。最流行的应该是Oracle和MySQL了,不过它们现在属于一家亲了,都属于Oracle公司旗下。虽然MySQL有社区版,但谁知道哪一天Oracle会停止社区版呢。毕竟现在Oracle连Java都敢收费了!这就是我们国家的芯片、系统、数据库等IT产品之殇!

后面我打算先使用开源的H2Database这个关系数据库产品,比较小巧、易用,是纯Java的,直接添加JAR包即可,不需要专门安装数据库服务器;它也支持JDBC;它还支持纯内存的模式;等等,可以参考其官网()。

关系数据库不仅在应用上很成熟,在理论上也是很严谨,已经形成一套标准的关系理论,实际上是以集合为中心的数学理论为基础的。

关系数据库的数据组织规则和存储规则最大的特点就是把数据组织成一张一张的二维表(类似于类、实体等概念),实际上很类似我们的纸质数据库。

表又由行和列组成,事先规定好每一列的含义(列又叫属性、字段等等),比如第一列是用户名、第二列是密码等等;而每一行就表示一条数据记录(即一个实例、对象等等),存储的时候就一行一行的存储,比如第一行是(张三、aaa、......)、第二行是(李四、bbb、......)

所以,关系数据库跟对象数据库很是相像,但底层的存储和上层的接口还是不同的。

不管怎样,我们把关系数据库简单理解为很多表的集合,每一张表又是很多行记录的集合就可以了。

关系数据库还有一个很重要的部分就是表与表之间是可能存在关系的(我把这个理解为关系,而不是现在大多数人理解的一张表就是一个关系,这个无关紧要,只要不偏离本质就行了)。比如,我们的租房网应用中需要用户表、房源表,但是用户租赁某个房源这种关系/事件/行为/操作/交易也是一种很重要很重要的数据哦,所以我们也需要某个表把它存储下来。

而这个表中至少应该记录是哪个用户租赁了哪个房源吧(当然,还有很多其他数据需要记录,比如时间、价格等等),所以,这个用户必然要在我的用户表中存在才可以啊,房源也是如此。从这个角度看,这个表就好像是描述了用户和房源的某种关系一样,所以把这种表就叫关系表吧。

当然,用户也可以把自己的房子发布为房源啊,这又是用户与房源之间的另一种关系/事件/行为/操作/交易,所以,相同的多个表之间,可能存在不止一种的关系哦。

本质上,我认为关系描述的其实就是行为或某种从属关系等等。

结构化查询语言(SQL)

结构化查询语言( Structured Query Language,简称为SQL)是专门用于数据库(最早是/特别是关系数据库)中数据的查询、更新、管理等操作的一种语言。

你也可以把它当做一种编程语言,当然这种程序是由DBMS来解释执行的,就类似于Java是由JVM来解释执行。

为什么称为结构化呢?我也说不太清楚,大家可以自行搜索答案。大体意思是这种语言可以让用户只需提出“干什么”(即操作什么样的数据),而无需指示DBMS“怎么干”(即操作数据的具体过程)。我的理解是,本质上这是运用了抽象的思维,实际也同时运用了分层和单一职责的思维(可以参考这篇文章),将复杂的数据存取过程交给DBMS,只提供给用户简单好用的SQL接口。

当然,这些思维的运用也体现在了SQL的语法上。我们写SQL语句/程序/脚本就很像是写普通的英文句子那样简单,最简单的增(Create)、删(Delete)、改(Update)、查(Read)(这四种操作简称为CRUD)的语句是:

insert into xxx_table(column_1, column_2, ...) values(value_1, value_2, ...)delete from xxx_table where column_1=value_1 and ...update xxx_table set column_1=new_value_1, column_2=new_value_2, ... where ...select column_1, column_2, ... where ...

关于SQL的语法就简单介绍那么多,因为涉及的内容实在太多了,这点从SQL标准的页数可以看出来,最新的SQL标准都上千页了,可以参考这篇文章()。

那SQL怎么使用呢?一种是在DBMS提供的工具中直接输入SQL语句/脚本/程序,然后点击执行即可。

还有一种就是通过其他编程语言调用SQL的方式。在Java语言中,它设计了一种接口标准来统一各个关系数据库(Oracle、MySQL等等)提供的调用SQL的方式,这就是JDBC( Java Database Connectivity,即Java数据库连接)接口标准。而各个关系数据库都提供自己的驱动来实现JDBC标准。

总结数据库就是为了解决数据的持久化问题、并发访问问题、高效便捷问题、数据一致性问题等等;数据库包括存储设备、数据、数据库管理系统(DBMS,一种软件);数据库种类有纸质数据库、文件系统、层次数据库、网状数据库、关系数据库、到现在流行的NoSQL数据库等等;关系数据库非常重要,仍在主流数据库中,有Oracle、MySQL等;关系数据库已形成完备的关系代数、范式理论;关系数据库核心概念是表、行、列、关系等;关系数据库使用SQL来实现数据的访问和管理;SQL的基本语法是增(Create)、删(Delete)、改(Update)、查(Read)操作(即CRUD);Java中主要使用JDBC接口来访问关系数据库中的数据。

标签: #数据库java