目录
1.JDBC简介
JDBC API是Java API,可以用来访问任意表格类型的数据,特别是存储在关系型数据库中的数据。
JDBC可以帮助编写涉及以下三种编程活动的java应用
- 连接到数据源(eg:数据库)
- 给数据库发送查询与更新语句
- 检索处理数据库查询的返回结果
1.1JDBC的产品组件
The JDBC API
JDBC提供了编程方法访问关联数据。
使用JDBC API,应用可以执行SQL语句,检索结果并且将结果传送给底层数据源。
JDBC API可以同时与位于分布异构环境下的多个数据源进行交互。
JDBC 4.0 API划分进两个包:java.sql与javax.sql。
JDBC Driver Manager
DriverManager类定义了连接Java应用与JDBC驱动的对象。
传统上,DriverManager是JDBC架构的支柱。
标准扩展包,javax.naming与javax.sql使应用可以使用通过JDNI命名服务注册的DataSource对象建立与数据源的连接。
JDBC Test Suite
The JDBC驱动测试套件帮助开发者确定驱动将要运行程序。
这些测试并不详实全面,但是它们执行了JDBC API中的许多重要特性。
JDBC-ODBC Bridge
Java软件桥接器通过ODBC驱动提供了JDBC方法。
注意,需要在使用了驱动的每一个客户端机器上加载ODBC的二进制代码。
结果,ODBC驱动最适合客户端安装不是主要问题的公司网络,或者是三层架构中用java编写的应用服务器代码。
1.2JDBC架构
JDBC API同时支持用于数据库访问的两层处理模型与三层处理模型。
在两层模型中,java应用直接与数据源对话,这需要可以与被访问数据源沟通的JDBC驱动。
用户的命令被发送给数据库或其他的数据源,这些语句的结果会被返还给用户。数据源可能位于用户通过网络连接的另一台机器上。
这即是一种C/S配置,用户机器为客户端,数据源所在的机器为服务端。网络可以是内联网也可以是互联网。
在三层模型中,命令被发往中间层。
中间层将命令发送给数据源,数据源处理这些命令,然后将结果返还中介层,最终中间层将它们发送给用户。
MIS主管发现三层模型非常有吸引力,因为中间层可以维护对访问的控制以及对企业数据的更新。
中间层还可以简化应用的部署,而且在很多场景下,三层架构可以提供性能优势。
中间层过去常常使用C、C++等可以提供高性能的语言编写。
由于,可以将java字节码转为更有效率的机器代码的优化编译器等技术的引入,Java平台的性能得到提升,成为了中间层开发的标准平台。
随着企业越来越多地使用java语言编写服务端代码,JDBC越来越多地用于三层架构中的中间层。
令JDBC称为服务端技术地特性包括,连接池支持、分布式事务、分离式行集。
JDBC API允许从中间层访问数据源。
1.3关系型数据库概览
数据库是存储信息的一种方法,可以从数据库访问数据。
关系型数据库就是使用表格表示信息数据库。
一张表可以被称之为一个关系,某种意义上来说,它是相同类型(行)对象的集合。
表中的数据通过公共的键或概念关联,从表中检索信息的能力是关系型数据库的基础。
Database Management System(DBMS)持有存储、维护、检索数据的方法。
RDBMS属于DBMS的一种。
完整性规则
关系表遵守一些完整性规则,这些规则确保持有的数据准确可被访问。
关系表中的行应该各不相同
传统关系模型中的列不能是重复组或数组
主键中的任何列都不为null
数据库使用使用null指示值缺少。null与空白或零不等价。
空白与另一个空白等价,零与另一个零等价。但两个null不会被认为定价。
SELECT 语句
SQL是用于关系型数据库的语言。
SELECT语句,又称为query(查询),用于获取表中的信息。
SELECT语句指定一个或多个列标题,一个或多个被查询的表以及一些用于选择的条件。
RDBMS返回满足要求的列条目的行集合。
SELECT First_Name, Last_Name
FROM Employees
WHERE Car_Number IS NOT NULL
WHERE 子句
SELECT语句中的WHERE子句提供了查询值的条件。
字符串匹配作为条件
SELECT First_Name, Last_Name
FROM Employees
WHERE Last_Name LIKE 'Washington%'
note:获取以Last_Name数据值以Washington开头的所有行。
ps:LIKE关键字用于比较字符串,它提供了可以使用通配符的模式的特性。
ps:_通配符代表任意一个字符,eg:Ba_man匹配Barman、Badman等。
数字比较作为条件
SELECT First_Name, Last_Name
FROM Employees
WHERE Car_Number = 12
note:获取以Car_Number等于12的所有行。
拼接条件
SELECT First_Name, Last_Name
FROM Employees
WHERE Employee_Number < 10100 and Car_Number IS NULL
note:获取Employee_Number小于10100并且Car_Number不为NULL的所有行。
联接
关系型数据库的一个显著特点就是可以通过连接访问多个表中的数据。
假设,在检索了拥有公司汽车的员工之后,还想知道哪一个员工拥有哪一辆车。
此时,必须存在一个列,同时出现在两个表内,将两个表关联起来。
这个列必须是一个表的主键,这个列在另一张表中称之为外键。
在这个例子中,Car_Number同时出现在两个表中,并且为Cars表的主键,所以也是Employee表的外键。
如果1996年的车牌号为ABC123的车失事并且将其从Cars表中删除,那么Employee表中的 Car_number 5也需要被删除,即维护引用完整性。
如果Employee不删除,那么Employee表中的外键列Car_Number将会出现一个不会引用Cars表中任何条目的条目。
引用完整性:一个外键要为null,要么等价于其所指向的主键值。
多表查询
SELECT Employees.First_Name, Employees.Last_Name,
Cars.License_Plate, Cars.Mileage, Cars.Year
FROM Employees, Cars
WHERE Employees.Car_Number = Cars.Car_Number
note:查询哪个员工拥有哪辆车。
常用SQL命令
SQL命令分为两类,一类为Data Manipulation Language(DML)命令,一类为Data Definition Languate(DDL)命令。
DML命令处理数据,检索数据,或更新数据以保持最新。
DDL命令创建或修改表与其他数据库对象(eg:视图、索引)。
常见DML命令:
- SELECT:用于从数据库中查询打印数据。
- INSERT:向表中添加新行。
- DELETE:从表中移除一个指定行或一个指定行集合。
- UPDATE:将表中一个列或一组列的已存在值进行修改,
常见的DDL命令:
- CREATE TABLE:使用用户提供的列名创建表。
- DROP TABLE:删除所有行并且将表定义从数据库中移除。
- ALTER TABLE:添加或移除表中的类,添加或移除表约束,修改列属性。
结果集与游标
满足查询条件的行集合称之为结果集。结果集中行数量可以为0、1或许多。
用户一次可以访问结果集中的一行,游标提供了此方法。
游标可以看作是指针,指向正在结果集中正在被访问的列。
游标可以使用户从头到底地处理结果集中的每一行,因此可以用于迭代处理。
当结果集生成时,许多DBMS自动创建了一个游标。
早期的JDBC API版本为结果集的游标添加新功能,允许它向前移动或向后移动,并且允许它移动到特定行或相对于其他行的位置。
事务
当一个用户访问数据库中的数据时,另一个用户在相同的时间访问相同的数据。
如果,第一个用户更新了表中的部分列,与此同时第二个用户正在查询同一个表。
这样,第二个用户可能获得一部分旧数据,一部分更新后的数据。
出于这个原因,当允许多个用户在同一时间访问数据库(数据并发性)时,DBMS使用事务来维护数据的状态一致性(数据一致性)。
事务是一条或多条SQL语句构成的集合,这些SQL语句构成了一个逻辑工作单元。
事务以一个提交或回滚结束,具体以两者中的哪一者结尾,取决于事务执行过程中是否出现数据一致性、数据并发行问题。
提交命令使事务产生与事务中SQL语句对应的永久性更改,回滚命令使事务中SQL语句执行引发的改变全部撤销。
用于阻止两个事务同时操作相同数据的机制是锁机制。
eg:如果表上仍然存在未提交的事务,表锁阻止表的删除。
一些DBMS中,表锁会锁住一张表中的所有行。
行锁会阻止两个事务同时修改同一行。
当行被事务修改时,行锁会阻止另一事务读取此行。
存储过程
存储过程是可以通过名称调用的一组SQL语句。
存储过程是可调用代码,一个执行特定任务可以像调用方法或函数一样调用的微型程序。
通常情况下,存储过程通过DBMS特定的编程语言编写。
最新一代的数据库产品允许使用Java语言与JDBC API编写存储过程。
使用Java程序编写的字节码可以在不同的BDMS之间移动。
一旦存储过程编写完成,它便可以使用与复用,因为DBMS支持将其存储在数据库之中。
元数据
数据库除了存储用户数据,还会存储数据库本身的相关信息。
大多数DBMS都会有一个系统表集合,表中列出了数据库中的表,每个表中的列名、主键、外键、存储外键等。
每一个DBMS都有自己的功能来获取有关表布局以及数据库特性的信息。
JDBC提供了接口DatabaseMetaData,驱动编写者必须实现这个接口,应用可以通过这个接口中的方法获取有关驱动与DBMS的信息。