[Java Backend Zero to Hello] BÀI 4.4: MYSQL/POSTGRESQL THỰC HÀNH
📚 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
- Tải MySQL Community Server: https://dev.mysql.com/downloads/mysql/
- Hoặc MySQL Installer cho Windows
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 clientpsql- PostgreSQL clientmysqldump- Backup MySQLpg_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
- Cài MySQL/PostgreSQL qua Docker
- Tạo database
mydb - Tạo user
appuservới password - 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
- Backup database
- Xóa database
- 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