Web后端基础:数据库
一、数据库基本概念
1. 数据库类型
-
关系型数据库(RDBMS)
- 基于关系模型(二维表),支持SQL,如MySQL、Oracle、PostgreSQL。
- 特点:数据结构化、支持事务、强一致性。
-
非关系型数据库(NoSQL)
- 基于键值、文档、列族或图结构,如Redis(键值)、MongoDB(文档)、Cassandra(列族)。
- 特点:灵活 schema、高扩展性、弱一致性。
2. SQL分类
- DDL(数据定义语言) :
CREATE
、ALTER
、DROP
。 - DML(数据操作语言) :
INSERT
、UPDATE
、DELETE
。 - DQL(数据查询语言) :
SELECT
。 - DCL(数据控制语言) :
GRANT
、REVOKE
。
二、MySQL基础操作
1. 创建数据库与表
sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4;
-- 使用数据库
USE mydb;
-- 创建表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. 增删改查(CRUD)
sql
-- 插入数据
INSERT INTO users (username, password, email) VALUES
('Alice', '123456', '[email protected]'),
('Bob', 'abcdef', '[email protected]');
-- 查询数据
SELECT * FROM users WHERE username = 'Alice';
-- 更新数据
UPDATE users SET password = 'newpass' WHERE id = 1;
-- 删除数据
DELETE FROM users WHERE id = 2;
3. 表关联查询
sql
-- 创建订单表
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
amount DECIMAL(10, 2),
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- 多表查询
SELECT u.username, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id;
三、JDBC(Java Database Connectivity)
1. 核心组件
- DriverManager:管理数据库驱动。
- Connection:数据库连接对象。
- Statement :SQL执行对象(含
PreparedStatement
、CallableStatement
)。 - ResultSet:结果集对象。
2. JDBC操作步骤
java
import java.sql.*;
public class JdbcExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "root";
String password = "123456";
try (Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
while (rs.next()) {
System.out.println(rs.getInt("id") + ", " +
rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3. PreparedStatement 防止SQL注入
java
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
try (Connection conn = DriverManager.getConnection(url, username, password);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "Alice");
pstmt.setString(2, "123456");
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
System.out.println("登录成功");
}
}
}
四、数据库设计原则
1. 三范式
- 第一范式(1NF):字段原子性,不可再分。
- 第二范式(2NF):消除部分依赖,非主键字段完全依赖主键。
- 第三范式(3NF):消除传递依赖,非主键字段不依赖其他非主键字段。
2. 索引优化
- 适用场景:高频查询的字段(如WHERE条件、JOIN关联字段)。
- 避免滥用:索引会降低写操作性能,占用额外存储空间。
3. 事务管理
-
ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
-
示例 :
javatry (Connection conn = DriverManager.getConnection(url, username, password)) { conn.setAutoCommit(false); // 开启事务 try (Statement stmt = conn.createStatement()) { stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1"); stmt.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE id = 2"); conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚事务 throw e; } }
五、数据库连接池
1. 常用连接池
- HikariCP:高性能连接池,Spring Boot默认选择。
- Druid:阿里巴巴开源,支持监控和SQL防火墙。
- C3P0:老牌连接池,配置灵活。
2. HikariCP配置示例
java
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("root");
config.setPassword("123456");
config.setMaximumPoolSize(10); // 最大连接数
try (HikariDataSource ds = new HikariDataSource(config);
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
// 处理结果
}
六、常见面试问题
-
主键与唯一键的区别?
- 主键:唯一标识记录,不允许NULL,一个表只能有一个主键。
- 唯一键:值唯一,允许NULL,一个表可多个唯一键。
-
索引的优缺点?
- 优点:提高查询速度。
- 缺点:增加写操作开销,占用存储空间。
-
如何优化慢SQL?
- 分析执行计划(EXPLAIN),添加合适索引,避免全表扫描。
-
事务的隔离级别有哪些?
- 读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)。
-
JDBC批处理如何实现?
javatry (Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users (username) VALUES (?)")) { for (String name : names) { pstmt.setString(1, name); pstmt.addBatch(); // 添加到批处理 } pstmt.executeBatch(); // 执行批处理 }
七、最佳实践
-
SQL注入防范:
- 优先使用
PreparedStatement
,避免字符串拼接SQL。
- 优先使用
-
连接池配置:
- 根据业务量调整最大连接数,避免连接耗尽。
-
数据库备份:
- 定期备份数据(如MySQL的
mysqldump
命令)。
- 定期备份数据(如MySQL的
-
慢SQL监控:
- 开启数据库慢查询日志,定期分析优化。
-
ORM框架:
- 使用MyBatis或Hibernate简化JDBC操作,减少样板代码。
掌握数据库基础是JavaWeb开发的核心技能,合理设计表结构、优化查询和管理事务是保证系统性能和数据安全的关键。