Web后端基础:数据库

Web后端基础:数据库

一、数据库基本概念
1. 数据库类型
  • 关系型数据库(RDBMS)

    • 基于关系模型(二维表),支持SQL,如MySQL、Oracle、PostgreSQL。
    • 特点:数据结构化、支持事务、强一致性。
  • 非关系型数据库(NoSQL)

    • 基于键值、文档、列族或图结构,如Redis(键值)、MongoDB(文档)、Cassandra(列族)。
    • 特点:灵活 schema、高扩展性、弱一致性。
2. SQL分类
  • DDL(数据定义语言)CREATEALTERDROP
  • DML(数据操作语言)INSERTUPDATEDELETE
  • DQL(数据查询语言)SELECT
  • DCL(数据控制语言)GRANTREVOKE
二、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执行对象(含PreparedStatementCallableStatement)。
  • 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)。

  • 示例

    java 复制代码
    try (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")) {
    
    // 处理结果
}
六、常见面试问题
  1. 主键与唯一键的区别?

    • 主键:唯一标识记录,不允许NULL,一个表只能有一个主键。
    • 唯一键:值唯一,允许NULL,一个表可多个唯一键。
  2. 索引的优缺点?

    • 优点:提高查询速度。
    • 缺点:增加写操作开销,占用存储空间。
  3. 如何优化慢SQL?

    • 分析执行计划(EXPLAIN),添加合适索引,避免全表扫描。
  4. 事务的隔离级别有哪些?

    • 读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)。
  5. JDBC批处理如何实现?

    java 复制代码
    try (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(); // 执行批处理
    }
七、最佳实践
  1. SQL注入防范

    • 优先使用PreparedStatement,避免字符串拼接SQL。
  2. 连接池配置

    • 根据业务量调整最大连接数,避免连接耗尽。
  3. 数据库备份

    • 定期备份数据(如MySQL的mysqldump命令)。
  4. 慢SQL监控

    • 开启数据库慢查询日志,定期分析优化。
  5. ORM框架

    • 使用MyBatis或Hibernate简化JDBC操作,减少样板代码。

掌握数据库基础是JavaWeb开发的核心技能,合理设计表结构、优化查询和管理事务是保证系统性能和数据安全的关键。

相关推荐
天天摸鱼的java工程师28 分钟前
商品详情页 QPS 达 10 万,如何设计缓存架构降低数据库压力?
java·后端·面试
天天摸鱼的java工程师34 分钟前
设计一个分布式 ID 生成器,要求全局唯一、趋势递增、支持每秒 10 万次生成,如何实现?
java·后端·面试
无色海1 小时前
MySQL协议中的TLS实现
数据库
阿杆1 小时前
一个看似普通的定时任务,如何优雅地毁掉整台服务器
java·后端·代码规范
粟悟饭&龟波功1 小时前
Java—— ArrayList 和 LinkedList 详解
java·开发语言
weixin_418007601 小时前
SpringJPA统计数据库表行数及更新频率
数据库
冷雨夜中漫步1 小时前
Java中如何使用lambda表达式分类groupby
java·开发语言·windows·llama
在未来等你1 小时前
互联网大厂Java求职面试:云原生架构与微服务设计中的复杂挑战
java·微服务·ai·云原生·秒杀系统·rag·分布式系统
浮游本尊1 小时前
Java学习第4天 - 异常处理与集合框架
java
2301_767233222 小时前
怎么优化MySQL中的索引
数据库·mysql