0

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

Java Backend Zero to Hello

📚 Bài viết thuộc series Java Backend Zero to Hello 📌 Phần: Phase 4: Database & SQL | Bài 39/86


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 Series

⬅️ Bài trước: BÀI 4.3: SQL NÂNG CAO

📋 Lộ trình tổng quan: Xem Toàn Bộ Series

➡️ Bài tiếp theo: BÀI 4.5: JDBC


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í