Java学习手册:关系型数据库基础
一、关系型数据库概述
关系型数据库是一种基于关系模型的数据库,它将数据组织成一个或多个表(或称为关系),每个表由行和列组成。每一列都有一个唯一的名字,称为属性,表中的每一行是一个元组,代表一个完整的数据记录。关系型数据库通过表之间的关系来存储和管理数据,这些关系可以通过外键等约束来定义。
常见的关系型数据库管理系统(RDBMS)包括 MySQL、PostgreSQL、Oracle、SQL Server 等,它们都使用 SQL(Structured Query Language,结构化查询语言)作为数据查询和操作的标准语言。
二、数据库设计
- 数据库建模 :在设计数据库之前,通常需要进行数据库建模。常用的建模方法有 E-R 图(实体 - 关系图),它可以清晰地表示实体、属性和实体之间的关系。例如,一个学校管理系统中,学生和课程是两个实体,它们之间存在多对多的关系,可以通过一个中间表来表示这种关系。
- 范式设计 :为了减少数据冗余和提高数据一致性,关系型数据库通常遵循一定的范式。常见的范式有第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。遵守范式的设计原则可以帮助我们更好地组织数据,减少数据异常。
三、基本操作
- 数据定义语言(DDL)
- CREATE :用于创建数据库对象,如数据库、表、索引等。例如,创建一个学生表:
CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50),age INT,major VARCHAR(50)
);
* **ALTER** :用于修改已存在的数据库对象的结构。例如,添加一个列:
ALTER TABLE students ADD email VARCHAR(100);
* **DROP** :用于删除数据库对象。例如,删除一个表:
DROP TABLE students;
- 数据操纵语言(DML)
- INSERT :向表中插入数据。例如:
INSERT INTO students (id, name, age, major) VALUES (1, 'John Doe', 20, 'Computer Science');
* **UPDATE** :更新表中的数据。例如:
UPDATE students SET age = 21 WHERE id = 1;
* **DELETE** :删除表中的数据。例如:
DELETE FROM students WHERE id = 1;
- 数据查询语言(DQL)
- SELECT :用于查询表中的数据。例如,查询所有学生的信息:
SELECT * FROM students;
* 条件查询:可以根据特定条件查询数据。例如,查询年龄大于 20 的学生:
SELECT * FROM students WHERE age > 20;
* 排序查询:可以对查询结果进行排序。例如,按照年龄降序排列:
SELECT * FROM students ORDER BY age DESC;
* 分组和聚合查询:可以使用 GROUP BY 子句和聚合函数(如 COUNT、SUM、AVG 等)对数据进行分组和聚合。例如,统计每个专业的学生数量:
SELECT major, COUNT(*) FROM students GROUP BY major;
- 数据控制语言(DCL)
- GRANT :用于授予用户对数据库对象的访问权限。例如:
GRANT SELECT, INSERT ON students TO 'username'@'localhost';
* **REVOKE** :用于撤销用户的访问权限:
REVOKE SELECT ON students FROM 'username'@'localhost';
四、事务管理
-
事务的 ACID 特性 :事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
- 原子性:事务中的操作要么全部成功,要么全部失败。
- 一致性:事务执行前后,数据库从一个一致状态转换到另一个一致状态。
- 隔离性:并发执行的事务之间互不干扰。
- 持久性:事务完成后,其对数据库的修改是永久的。
-
事务操作 :在 SQL 中,可以使用 COMMIT 提交事务,使用 ROLLBACK 回滚事务。例如:
START TRANSACTION;
UPDATE account1 SET balance = balance - 100 WHERE id = 1;
UPDATE account2 SET balance = balance + 100 WHERE id = 2;
COMMIT;
五、索引
- 索引的作用 :索引是数据库中用于提高查询速度的结构,类似于书籍的目录。通过在表的列上创建索引,可以加快对数据的查询速度。
- 索引的类型 :常见的索引类型有单列索引、复合索引、唯一索引、全文索引等。
- 创建索引 :例如,在学生表的 name 列上创建索引:
CREATE INDEX idx_name ON students (name);
- 使用索引的注意事项 :虽然索引可以提高查询速度,但也会增加插入、更新和删除数据时的开销。因此,在创建索引时需要权衡查询性能和数据修改的开销。
六、视图
- 视图的作用 :视图是一种虚拟表,其内容由查询定义。视图可以简化复杂的查询,隐藏数据的复杂性,还可以用于限制对某些数据的访问。
- 创建视图 :例如,创建一个显示学生姓名和专业的视图:
CREATE VIEW student_info AS
SELECT name, major FROM students;
- 查询视图 :查询视图和查询表类似:
SELECT * FROM student_info;
- 更新视图 :某些情况下,可以通过视图更新数据,但复杂的视图可能不支持更新操作。
七、存储过程
- 存储过程的作用 :存储过程是一组 SQL 语句的集合,它可以预先编译并存储在数据库中。通过调用存储过程,可以执行一系列的操作,减少网络传输,提高执行效率。
- 创建存储过程 :例如,在 MySQL 中创建一个计算两个数之和的存储过程:
DELIMITER //
CREATE PROCEDURE add_numbers (IN a INT, IN b INT, OUT result INT)
BEGINSET result = a + b;
END //
DELIMITER ;
- 调用存储过程 :
CALL add_numbers(5, 3, @result);
SELECT @result;
八、数据库连接池
- 数据库连接池的作用 :在 JavaWeb 开发中,频繁地创建和关闭数据库连接会带来较大的性能开销。数据库连接池预先创建并维护一定数量的数据库连接,当应用需要进行数据库操作时,可以从连接池中获取一个空闲连接,使用完毕后再将连接归还给连接池,而不是真正地关闭连接。这样可以显著减少连接创建和释放的开销,提高数据库操作的性能和效率。
- 常见的数据库连接池 :包括 DBCP(Apache 数据库连接池)、C3P0、HikariCP 等。
- 配置连接池 :通常需要在应用初始化时配置连接池参数,如初始连接数、最大连接数、最小空闲连接数等。然后通过连接池提供的接口获取数据库连接,进行数据库操作。
九、总结
掌握关系型数据库的基础知识对于 Java 开发者来说是至关重要的,无论是进行 Web 开发还是企业级应用开发,都离不开与数据库的交互。通过深入理解关系型数据库的基本概念、数据库设计原则、SQL 语言的使用、事务管理、索引优化、视图和存储过程的应用等,开发者能够更加高效地进行数据库操作,构建出性能优良、数据一致的应用系统。在实际开发中,还需不断地实践和优化,以应对各种复杂的业务需求。