0

[Java Backend Zero to Hello] [Phase 4] BÀI 4.4: MYSQL/POSTGRESQL THỰC HÀNH

📚 Series: Java Backend Zero to Hello 📂 Phân đoạn: Phase 4: Database & SQL 📖 Nội dung: BÀI 4.4: MYSQL/POSTGRESQL THỰC HÀNH 💡 Khóa học lập trình Backend Java & Spring Boot chuẩn doanh nghiệp từ con số 0.


BÀI 4.4: MYSQL/POSTGRESQL THỰC HÀNH

Mục tiêu

  • Cài đặt MySQL/PostgreSQL
  • Quản lý user và phân quyền
  • Backup và restore
  • Sử dụng công cụ quản lý

1. CÀI ĐẶT MYSQL

1.1 Cài đặt trực tiếp

1.2 Cài qua Docker (khuyến nghị)

docker run --name mysql \
  -e MYSQL_ROOT_PASSWORD=password \
  -e MYSQL_DATABASE=mydb \
  -p 3306:3306 \
  -v mysql-data:/var/lib/mysql \
  -d mysql:8

1.3 Kết nối

# Từ terminal
mysql -u root -p

# Từ Docker
docker exec -it mysql mysql -u root -p

2. CÀI ĐẶT POSTGRESQL

2.1 Cài qua Docker

docker run --name postgres \
  -e POSTGRES_PASSWORD=password \
  -e POSTGRES_DB=mydb \
  -p 5432:5432 \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres:16

2.2 Kết nối

docker exec -it postgres psql -U postgres -d mydb

3. QUẢN LÝ USER

3.1 MySQL

-- Tạo user
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'password';

-- Cấp quyền
GRANT ALL PRIVILEGES ON mydb.* TO 'appuser'@'localhost';
GRANT SELECT, INSERT ON mydb.* TO 'readonly'@'localhost';

-- Xem quyền
SHOW GRANTS FOR 'appuser'@'localhost';

-- Thu hồi quyền
REVOKE ALL PRIVILEGES ON mydb.* FROM 'appuser'@'localhost';

-- Xóa user
DROP USER 'appuser'@'localhost';

-- Áp dụng thay đổi
FLUSH PRIVILEGES;

3.2 PostgreSQL

-- Tạo user
CREATE USER appuser WITH PASSWORD 'password';

-- Cấp quyền
GRANT ALL PRIVILEGES ON DATABASE mydb TO appuser;
GRANT ALL ON ALL TABLES IN SCHEMA public TO appuser;

-- Xem quyền
\du

-- Xóa user
DROP USER appuser;

4. CÔNG CỤ QUẢN LÝ

4.1 GUI Tools

  • MySQL Workbench - MySQL chính thức
  • DBeaver - Miễn phí, đa nền tảng
  • DataGrip - JetBrains (trả phí)
  • pgAdmin - PostgreSQL chính thức
  • TablePlus - Đẹp, dễ dùng

4.2 CLI Tools

  • mysql - MySQL client
  • psql - PostgreSQL client
  • mysqldump - Backup MySQL
  • pg_dump - Backup PostgreSQL

5. BACKUP VÀ RESTORE

5.1 MySQL

# Backup
mysqldump -u root -p mydb > backup.sql
mysqldump -u root -p --all-databases > all_backup.sql

# Backup chỉ schema
mysqldump -u root -p --no-data mydb > schema.sql

# Restore
mysql -u root -p mydb < backup.sql

5.2 PostgreSQL

# Backup
pg_dump -U postgres mydb > backup.sql
pg_dump -U postgres -Fc mydb > backup.dump  # Custom format

# Restore
psql -U postgres -d mydb < backup.sql
pg_restore -U postgres -d mydb backup.dump

5.3 Auto backup với cron

# Crontab: backup mỗi ngày lúc 2h sáng
0 2 * * * mysqldump -u root -p'password' mydb > /backup/mydb_$(date +\%Y\%m\%d).sql

6. CẤU HÌNH KẾT NỐI TỪ JAVA

6.1 MySQL JDBC URL

jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8

6.2 PostgreSQL JDBC URL

jdbc:postgresql://localhost:5432/mydb

6.3 Dependency

<!-- MySQL -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.2.0</version>
</dependency>

<!-- PostgreSQL -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.7.1</version>
</dependency>

7. MYSQL VS POSTGRESQL

Tiêu chí MySQL PostgreSQL
Tốc độ Nhanh cho read Nhanh cho write phức tạp
JSON Hỗ trợ Hỗ trợ mạnh hơn
Full-text search Có Có
Replication Tốt Tốt
ACID InnoDB Mặc định
Extensions Ít Nhiều
Phổ biến Rất cao Cao

8. THIẾT KẾ DATABASE MẪU

8.1 E-commerce Schema

-- Users
CREATE TABLE users (
    id BIGSERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    full_name VARCHAR(100),
    phone VARCHAR(20),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Categories
CREATE TABLE categories (
    id BIGSERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    description TEXT,
    parent_id BIGINT REFERENCES categories(id)
);

-- Products
CREATE TABLE products (
    id BIGSERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    price DECIMAL(10,2) NOT NULL,
    stock INT DEFAULT 0,
    category_id BIGINT REFERENCES categories(id),
    image_url VARCHAR(500),
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Orders
CREATE TABLE orders (
    id BIGSERIAL PRIMARY KEY,
    user_id BIGINT REFERENCES users(id),
    total DECIMAL(10,2) NOT NULL,
    status VARCHAR(20) DEFAULT 'PENDING',
    shipping_address TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Order Items
CREATE TABLE order_items (
    id BIGSERIAL PRIMARY KEY,
    order_id BIGINT REFERENCES orders(id) ON DELETE CASCADE,
    product_id BIGINT REFERENCES products(id),
    quantity INT NOT NULL,
    price DECIMAL(10,2) NOT NULL
);

-- Indexes
CREATE INDEX idx_products_category ON products(category_id);
CREATE INDEX idx_orders_user ON orders(user_id);
CREATE INDEX idx_orders_status ON orders(status);
CREATE INDEX idx_order_items_order ON order_items(order_id);

9. BÀI TẬP THỰC HÀNH

Bài 1: Cài đặt và kết nối

  1. Cài MySQL/PostgreSQL qua Docker
  2. Tạo database mydb
  3. Tạo user appuser với password
  4. Kết nối từ DBeaver/Workbench

Bài 2: Tạo schema

Tạo schema cho hệ thống blog:

  • users (id, username, email, password)
  • posts (id, user_id, title, content, published)
  • comments (id, post_id, user_id, content)
  • tags (id, name)
  • post_tags (post_id, tag_id)

Bài 3: Backup/Restore

  1. Backup database
  2. Xóa database
  3. Restore từ backup

10. TÓM TẮT

Khái niệm Mô tả
Docker Container hóa database
User/Grant Quản lý quyền
Backup/Restore Sao lưu và phục hồi
JDBC URL Chuỗi kết nối
Schema Cấu trúc database

Bài tiếp theo: 4.5 JDBC


🧭 Điều hướng bài học

⭐ Hãy bookmark (clip) lại series để tiện theo dõi các bài học tiếp theo nhé!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí