java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class AccessControlExample {
public static void main(String[] args) {
try {
// 模拟用户认证
String username = "user1";
String password = "password1";
if (authenticateUser(username, password)) {
// 模拟授权操作,这里假设用户有查询权限
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/yourdb", username, password);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table");
while (resultSet.next()) {
System.out.println(resultSet.getString(1));
}
resultSet.close();
statement.close();
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean authenticateUser(String username, String password) {
// 简单模拟认证逻辑
return "user1".equals(username) && "password1".equals(password);
}
}
sql
-- 创建一个表用于存储订单信息
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT,
quantity INT
);
-- 创建一个表用于存储商品库存信息
CREATE TABLE inventory (
product_id INT PRIMARY KEY,
stock INT
);
-- 创建触发器,在插入订单时更新库存
DELIMITER //
CREATE TRIGGER update_inventory_after_order
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
UPDATE inventory
SET stock = stock - NEW.quantity
WHERE product_id = NEW.product_id;
END //
DELIMITER ;
sql
-- 创建一个存储过程用于计算利息
DELIMITER //
CREATE PROCEDURE calculate_interest(IN principal DECIMAL(10, 2), IN rate DECIMAL(5, 2), IN time INT, OUT interest DECIMAL(10, 2))
BEGIN
SET interest = (principal * rate * time) / 100;
END //
DELIMITER ;
-- 调用存储过程
SET @interest = 0;
CALL calculate_interest(1000, 5, 1, @interest);
SELECT @interest;
sql
-- 创建一个表用于测试
CREATE TABLE test_table (
id INT PRIMARY KEY,
name VARCHAR(50)
);
INSERT INTO test_table VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
-- 使用游标遍历表中的记录
DELIMITER //
CREATE PROCEDURE iterate_table()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE v_id INT;
DECLARE v_name VARCHAR(50);
DECLARE cur CURSOR FOR SELECT id, name FROM test_table;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
read_loop: LOOP
FETCH cur INTO v_id, v_name;
IF done THEN
LEAVE read_loop;
END IF;
-- 处理每一行数据,这里简单打印
SELECT CONCAT('ID: ', v_id, ', Name: ', v_name);
END LOOP;
CLOSE cur;
END //
DELIMITER ;
-- 调用存储过程
CALL iterate_table();
java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DatabaseBackupExample {
public static void main(String[] args) {
try {
File sourceFile = new File("path/to/your/database/file");
File backupFile = new File("path/to/backup/database/file");
FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(backupFile);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
fis.close();
fos.close();
System.out.println("Database backup completed.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
public class UserAuthenticationExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter username: ");
String username = scanner.nextLine();
System.out.print("Enter password: ");
String password = scanner.nextLine();
try {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/yourdb", username, password);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table");
while (resultSet.next()) {
System.out.println(resultSet.getString(1));
}
resultSet.close();
statement.close();
connection.close();
} catch (Exception e) {
System.out.println("Authentication failed.");
}
}
}
java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class DataEncryptionExample {
public static void main(String[] args) throws Exception {
String plainText = "Sensitive data";
// 生成密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
// 加密
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("Encrypted text: " + encryptedText);
// 解密
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes, StandardCharsets.UTF_8);
System.out.println("Decrypted text: " + decryptedText);
}
}
java
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class DatabaseAuditExample {
public static void main(String[] args) {
try {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/yourdb", "user", "password");
Statement statement = connection.createStatement();
String sql = "SELECT * FROM your_table";
// 记录操作日志
logOperation(sql);
statement.executeQuery(sql);
statement.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void logOperation(String operation) {
try (PrintWriter writer = new PrintWriter(new FileWriter("database_audit.log", true))) {
writer.println(System.currentTimeMillis() + ": " + operation);
} catch (IOException e) {
e.printStackTrace();
}
}
}
SELECT ... LOCK IN SHARE MODE
语句可加共享锁。sql
-- 会话 1
START TRANSACTION;
SELECT * FROM products WHERE product_id = 1 LOCK IN SHARE MODE;
-- 这里可以继续执行其他操作
COMMIT;
-- 会话 2
START TRANSACTION;
SELECT * FROM products WHERE product_id = 1 LOCK IN SHARE MODE;
-- 可以正常执行,因为共享锁不互斥
COMMIT;
SELECT ... FOR UPDATE
语句可加排他锁。sql
-- 会话 1
START TRANSACTION;
SELECT * FROM accounts WHERE account_id = 1 FOR UPDATE;
-- 进行账户更新操作
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
COMMIT;
-- 会话 2
START TRANSACTION;
SELECT * FROM accounts WHERE account_id = 1 FOR UPDATE;
-- 会被阻塞,直到会话 1 的排他锁释放
COMMIT;
LOCK TABLES
语句时可对表加锁,使用 UNLOCK TABLES
语句释放锁。sql
-- 会话 1
LOCK TABLES products WRITE;
-- 进行表的更新操作
UPDATE products SET price = price * 1.1;
UNLOCK TABLES;
-- 会话 2
-- 在会话 1 释放锁之前,以下操作会被阻塞
SELECT * FROM products;
sql
-- 会话 1
START TRANSACTION;
SELECT * FROM products WHERE product_id = 1 FOR UPDATE;
-- 进行行的更新操作
UPDATE products SET stock = stock - 1 WHERE product_id = 1;
COMMIT;
-- 会话 2
START TRANSACTION;
SELECT * FROM products WHERE product_id = 2 FOR UPDATE;
-- 可以正常执行,因为操作的是不同的行
UPDATE products SET stock = stock - 1 WHERE product_id = 2;
COMMIT;
BEGIN TRANSACTION
、COMMIT
和 ROLLBACK
语句来实现事务的开始、提交和回滚。BEGIN TRANSACTION
和 COMMIT
之间,若执行过程中出现异常,则执行 ROLLBACK
语句回滚事务。sql
START TRANSACTION;
-- 插入订单记录
INSERT INTO orders (order_id, product_id, quantity) VALUES (1, 1, 1);
-- 更新库存
UPDATE inventory SET stock = stock - 1 WHERE product_id = 1;
-- 检查是否有足够的库存
IF (SELECT stock FROM inventory WHERE product_id = 1) < 0 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
Connection.setAutoCommit(false)
方法开启事务,Connection.commit()
方法提交事务,Connection.rollback()
方法回滚事务。java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class TransactionExample {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/yourdb", "user", "password");
connection.setAutoCommit(false);
statement = connection.createStatement();
// 插入订单记录
statement.executeUpdate("INSERT INTO orders (order_id, product_id, quantity) VALUES (1, 1, 1)");
// 更新库存
statement.executeUpdate("UPDATE inventory SET stock = stock - 1 WHERE product_id = 1");
connection.commit();
} catch (Exception e) {
try {
if (connection != null) {
connection.rollback();
}
} catch (Exception ex) {
ex.printStackTrace();
}
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.setAutoCommit(true);
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
第一范式(1NF)
sql
CREATE TABLE users (
user_id INT PRIMARY KEY,
name VARCHAR(50),
phone_number VARCHAR(20),
email VARCHAR(50)
);
sql
-- 订单表
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
-- 订单商品表
CREATE TABLE order_items (
order_item_id INT PRIMARY KEY,
order_id INT,
product_id INT,
quantity INT,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
sql
-- 员工表
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(50),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
-- 部门表
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(50)
);
sql
-- 可以使用 EXPLAIN 分析查询语句的执行计划
EXPLAIN SELECT * FROM products WHERE category = 'electronics';
sql
-- 创建角色
CREATE ROLE 'read_only_role';
-- 授予角色查询权限
GRANT SELECT ON your_database.* TO 'read_only_role';
-- 创建用户并分配角色
CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password';
GRANT 'read_only_role' TO 'new_user'@'localhost';
sql
-- 创建包含 JSON 字段的表
CREATE TABLE users (
user_id INT PRIMARY KEY,
name VARCHAR(50),
settings JSON
);
-- 插入 JSON 数据
INSERT INTO users (user_id, name, settings) VALUES (1, 'Alice', '{"theme": "dark", "notifications": true}');
-- 查询 JSON 数据
SELECT user_id, name, settings->'$.theme' AS theme FROM users;
-- 使用窗口函数计算排名
SELECT product_id, price, RANK() OVER (ORDER BY price DESC) AS price_rank FROM products;
sql
-- 假设表名为 student_scores
SELECT id
FROM student_scores
GROUP BY id
HAVING AVG(分数) > 80
ORDER BY 分数 DESC;
GROUP BY
对 id
进行分组,使用 AVG
函数计算每个 id
的平均分,HAVING
筛选出平均分大于 80 的 id
,最后使用 ORDER BY
按分数降序排序。GROUP BY
用于分组,HAVING
用于筛选分组后的结果,ORDER BY
用于排序。id
,以便进行奖励。
MySQL 的事务通过日志系统(如 InnoDB 的 redo log 和 undo log)来保证失败回滚。当一个事务开始时,MySQL 会记录所有的操作到 undo log 中。如果事务执行过程中出现错误,MySQL 会根据 undo log 中的记录将数据恢复到事务开始前的状态。同时,redo log 用于在数据库崩溃后恢复数据,保证事务的持久性。
在银行转账系统中,如果在转账过程中出现系统故障,事务可以回滚,保证资金的安全。
SQL 代码示例(模拟事务回滚)
sql
START TRANSACTION;
-- 模拟转账操作
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- 模拟出现错误
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Simulated error';
ROLLBACK;
假设学生表名为 students
,包含字段 id
和 name
;成绩表名为 scores
,包含字段 student_id
和 score
。
sql
SELECT s.name, SUM(sc.score) AS total_score
FROM students s
JOIN scores sc ON s.id = sc.student_id
GROUP BY s.id, s.name
HAVING SUM(sc.score) > 500;
JOIN
将学生表和成绩表关联,使用 GROUP BY
按学生的 id
和 name
分组,SUM
计算每个学生的总成绩,HAVING
筛选出总成绩大于 500 的学生。JOIN
用于关联两个表,GROUP BY
用于分组,SUM
用于计算总成绩,HAVING
用于筛选分组后的结果。
java
import java.util.TreeSet;
public class ThirdLargestNumber {
public static int thirdLargest(int[] nums) {
TreeSet set = new TreeSet<>();
for (int num : nums) {
set.add(num);
if (set.size() > 3) {
set.pollFirst();
}
}
return set.size() < 3 ? set.last() : set.first();
}
public static void main(String[] args) {
int[] nums = {3, 2, 1, 5, 6, 4};
System.out.println(thirdLargest(nums));
}
}
TreeSet
存储数组元素,TreeSet
会自动排序。遍历数组,将元素添加到 TreeSet
中,若 TreeSet
大小超过 3,则移除最小元素。最后根据 TreeSet
大小返回相应结果。TreeSet
可自动排序,pollFirst()
移除最小元素,last()
获取最大元素,first()
获取最小元素。TreeSet
大小限制改为 k。
友情提示:本文已经整理成文档,可以到如下链接免积分下载阅读
https://download.csdn.net/download/ylfhpy/90567215