数据库是按照数据结构来组织、存储和管理数据的仓库。
数据库管理系统(DBMS)是用于创建、管理和维护数据库的软件。
SQL(Structured Query Language)是一种用于管理和操作数据库的语言。
MySQL是一种开源的关系型数据库管理系统。
关系型数据库使用表格来存储数据,每个表格由行和列组成。非关系型数据库(如MongoDB)使用键值对来存储数据,每个键值对由一个键和一个值组成。
mysql -u root -p
show databases;
create database database_name;
use database_name;
show tables;
desc table_name;
-- 创建数据库
CREATE DATABASE [if not exists] database_name;
-- 删除数据库
DROP DATABASE [if exists] database_name;
-- 选择数据库
USE database_name;
-- 如果操作的表名或字段名为特殊字符,需要用反引号括起来
USE `database_name`;
-- 查看数据库
SHOW DATABASES;
-- 查看当前数据库
SELECT DATABASE();
-- 查看数据库的创建信息
SHOW CREATE DATABASE database_name;
CREATE TABLE 表名(
`字段名` 字段类型 [列属性] [注释],
`字段名` 字段类型 [列属性] [注释],
···
`字段名` 字段类型 [列属性] [注释]
)[表类型][字符集][注释];
CREATE TABLE `users`(
`id` INT NOT NULL AUTO_INCREMENT COMMENT '主键id',
`name` VARCHAR(255) NOT NULL COMMENT '用户名',
`password` VARCHAR(255) NOT NULL COMMENT '密码',
`age` INT NOT NULL COMMENT '年龄',
`email` VARCHAR(255) NOT NULL COMMENT '邮箱',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
show create table 表名; 查看创建表的语句
desc 表名; 查看表结构
show tables; 查看当前数据库中的所有表
show tables like ‘表名’; 查看当前数据库中符合要求的表
show databases; 查看所有数据库
show create database 数据库名; 查看创建数据库的语句
外键是用于建立和加强两个表数据之间的链接的一种关系。它是一种约束,用于保证数据的一致性和完整性。外键约束可以防止无效数据的插入,例如,如果表A中的某个值在表B中没有对应的值,那么插入操作将会失败。
在建表时添加外键约束的语法如下:
CREATE TABLE 表名 (
列名 数据类型,
...
CONSTRAINT 外键名 FOREIGN KEY (列名) REFERENCES 参考表名(参考列名)
);
使用修改表语法添加外键约束的语法如下:
ALTER TABLE 表名
ADD CONSTRAINT 外键名
FOREIGN KEY (列名) REFERENCES 参考表名(参考列名);
INSERT INTO 表名 (列1, 列2, 列3, …)
VALUES (值1, 值2, 值3, …);
INSERT INTO 表名 (列1, 列2, 列3, …)
VALUES (值1, 值2, 值3, …),
(值4, 值5, 值6, …),
…;
INSERT INTO students (id, name, age, gender, class_id)
VALUES (1, '张三', 18, '男', 1),
(2, '李四', 19, '女', 2),
(3, '王五', 20, '男', 1),
(4, '赵六', 21, '女', 2);
UPDATE 表名
SET 列1 = 值1, 列2 = 值2, …
WHERE 条件;
UPDATE students
SET age = 22
WHERE name = '张三';
DELETE FROM 表名 WHERE 条件;
TRUNCATE TABLE 表名;
DELETE FROM students WHERE name = '张三';
TRUNCATE TABLE students;
这两个语句都可以清空表,但是DELETE from table不会重设自增列,但是truncate table会重设自增列。
SELECT DISTINCT * | 列1, 列2, 列3, …
FROM 表名
[WHERE 条件]
[GROUP BY 列1, 列2, … [HAVING 条件]]
[HAVING 条件]
[ORDER BY 列1, 列2, … [ASC | DESC]]
[LIMIT [OFFSET,] 行数];
SELECT * FROM students;
SELECT id, name FROM students;
SELECT * FROM students WHERE age > 18;
SELECT * FROM students WHERE age > 18 AND gender = '男';
SELECT * FROM students WHERE age > 18 OR gender = '男';
SELECT * FROM students WHERE NOT gender = '男';
SELECT * FROM students WHERE name LIKE '李%';
SELECT * FROM students WHERE name LIKE '李_';
SELECT * FROM students WHERE name LIKE '_华';
SELECT * FROM students WHERE name LIKE '%华';
SELECT * FROM students WHERE age BETWEEN 18 AND 25;
SELECT * FROM students WHERE age NOT BETWEEN 18 AND 25;
SELECT * FROM students WHERE id IN (1, 3, 8);
SELECT * FROM students WHERE id NOT IN (2, 5, 7);
SELECT * FROM students ORDER BY age;
SELECT * FROM students ORDER BY age DESC;
SELECT * FROM students ORDER BY age ASC, name DESC;
SELECT * FROM students LIMIT 3;
SELECT * FROM students LIMIT 0, 3;
SELECT * FROM students LIMIT 3, 3;
SELECT * FROM students LIMIT 6, 3;
SELECT id AS 学号, name AS 姓名, age AS 年龄 FROM students;
SELECT COUNT(*) FROM students;
SELECT COUNT(*) FROM students WHERE gender = '男';
SELECT AVG(age) FROM students;
SELECT SUM(age) FROM students;
SELECT MAX(age) FROM students; -- 查询年龄最大值
SELECT MIN(age) FROM students; -- 查询年龄最小值
SELECT gender, COUNT(*) FROM students GROUP BY gender;
SELECT gender, AVG(age) FROM students GROUP BY gender;
SELECT gender, COUNT(*) FROM students GROUP BY gender HAVING gender = '男';
SELECT * FROM students WHERE age > (SELECT AVG(age) FROM students);
SELECT * FROM students, classes;
SELECT * FROM students, classes WHERE students.class_id = classes.id;
SELECT * FROM students AS s, classes AS c WHERE s.class_id = c.id; -- 使用别名
SELECT s.id, s.name, c.name FROM students AS s, classes AS c WHERE s.class_id = c.id;
SELECT * FROM students INNER JOIN classes ON students.class_id = classes.id;
SELECT * FROM students LEFT JOIN classes ON students.class_id = classes.id;
SELECT * FROM students RIGHT JOIN classes ON students.class_id = classes.id;
SELECT * FROM students LEFT JOIN classes ON students.class_id = classes.id
UNION
SELECT * FROM students RIGHT JOIN classes ON students.class_id = classes.id;
SELECT a.name, b.name FROM students AS a, students AS b WHERE a.addr = b.addr;
SELECT * FROM students WHERE gender = '男'
UNION
SELECT * FROM students WHERE age < 20;
SELECT * FROM students WHERE name REGEXP '^李';
SELECT * FROM students WHERE name REGEXP '亮$';
SELECT * FROM students WHERE name REGEXP '国|伟';
SELECT * FROM students WHERE name REGEXP '[uvw]';
SELECT * FROM students WHERE name LIKE '李_';
SELECT * FROM students WHERE name LIKE '李%';
SELECT * FROM students ORDER BY age;
SELECT * FROM students ORDER BY age DESC;
SELECT * FROM students ORDER BY age, gender;
SELECT * FROM students LIMIT 0, 3;
SELECT * FROM students LIMIT 3, 3;
SELECT CONCAT('hello', 'world'); # 拼接字符串
、SELECT LENGTH('hello'); # 获取字符串长度
SELECT UPPER('hello'); # 转换为大写
SELECT LOWER('HELLO'); # 转换为小写
SELECT SUBSTRING('hello', 1, 3); # 截取字符串
SELECT REPLACE('hello', 'l', 'w'); # 替换字符串
SELECT ABS(-1); # 绝对值
SELECT CEIL(3.14); # 向上取整
SELECT FLOOR(3.14); # 向下取整
SELECT ROUND(3.14); # 四舍五入
SELECT RAND(); # 生成随机数
SELECT POW(2, 3); # 幂运算
SELECT SQRT(4); # 平方根
SELECT TRUNCATE(3.1415926, 3); # 截断小数位数
SELECT NOW(); # 获取当前日期和时间
SELECT CURDATE(); # 获取当前日期
SELECT CURTIME(); # 获取当前时间
SELECT DATE(NOW()); # 获取日期部分
SELECT TIME(NOW()); # 获取时间部分
SELECT YEAR(NOW()); # 获取年份
SELECT MONTH(NOW()); # 获取月份
SELECT DAY(NOW()); # 获取日期
SELECT HOUR(NOW()); # 获取小时
SELECT MINUTE(NOW()); # 获取分钟
SELECT SECOND(NOW()); # 获取秒数
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); # 日期加法
SELECT DATEDIFF(NOW(), '2020-01-01'); # 日期差值
SELECT COUNT(*) FROM table_name; # 统计行数 ,忽略所有的NULL值
SELECT SUM(column_name) FROM table_name; # 求和
SELECT AVG(column_name) FROM table_name; # 平均值
SELECT MAX(column_name) FROM table_name; # 最大值
SELECT MIN(column_name) FROM table_name; # 最小值
事务是指一组SQL语句的集合,它们要么全部执行成功,要么全部执行失败。事务的四个特性:原子性、一致性、隔离性、持久性(ACID)。
SET AUTOCOMMIT = 0; # 关闭自动提交
SET AUTOCOMMIT = 1; # 开启自动提交
START TRANSACTION; # 开始事务
COMMIT; # 提交事务
ROLLBACK; # 回滚事务
索引是数据库中用于提高查询效率的数据结构。索引可以加快数据检索的速度,但是会降低数据插入、更新和删除的速度,因为每次修改数据时,索引也需要更新。
CREATE INDEX index_name ON table_name (column_name); # 创建普通索引
CREATE UNIQUE INDEX index_name ON table_name (column_name); # 创建唯一索引
CREATE INDEX index_name ON table_name (column1, column2); # 创建组合索引
EXPLAIN SELECT * FROM table_name WHERE column_name = 'value'; # 分析查询语句
CREATE USER 'username'@'host' IDENTIFIED BY 'password'; # 创建用户
RENAME USER 'old_username'@'host' TO 'new_username'@'host'; # 重命名用户
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host'; # 授予权限
FLUSH PRIVILEGES; # 刷新权限
REVOKE ALL PRIVILEGES ON database_name.* FROM 'username'@'host'; # 撤销权限
DROP USER 'username'@'host'; # 删除用户
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password'; # 修改密码
SHOW GRANTS FOR 'username'@'host'; # 查看用户权限
mysqldump -uusername -ppassword database_name > backup.sql # 备份数据库
# 在命令行中登录时,切换到准备恢复的数据库执行
source backup.sql # 恢复数据库
#在命令行中未登录时执行
mysql -u username -ppassword database_name < backup.sql # 恢复数据库
数据库驱动是连接Java应用程序和数据库之间的桥梁,它提供了一种标准的方法来访问和操作数据库。不同的数据库厂商会提供自己的数据库驱动,以便Java应用程序可以连接到他们提供的数据库。
下载地址:https://downloads.mysql.com/archives/c-j/
Class.forName()
方法加载驱动类。DriverManager.getConnection()
方法建立数据库连接。Connection.createStatement()
方法创建Statement对象。executeQuery()
、executeUpdate()
等方法执行SQL语句。Connection.close()
方法关闭数据库连接。import java.sql.*;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 添加数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 创建连接到数据库
String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url,user,password);
// 创建执行sql的对象
Statement statement = conn.createStatement();
// 使用执行sql的对象 来执行sql
String sql = "select * from studentpre;";
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
System.out.println(id + " " + name + " " + age);
}
// 关闭连接
conn.close();
statement.close();
resultSet.close();
}
}
// 方式一
public class JDBCUtils {
private static String url;
private static String username;
private static String password;
private static String driver;
static {
try {
Properties properties = new Properties();
properties.load(new FileInputStream("d:\\test\\jdbc.properties"));
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
driver = properties.getProperty("driver");
Class.forName(driver);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
public static void close(ResultSet resultSet, Statement statement, Connection connection){
try {
if (resultSet != null){
resultSet.close();
}
if (statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static void close(Statement statement, Connection connection){
close(null,statement,connection);
}
}
// 方式二
import java.io.*;
import java.sql.*;
import java.util.*;
public class JdbcUtils {
private static String driver = null;
private static String url = null;
private static String user = null;
private static String password = null;
static {
InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties prop = new Properties();
try {
prop.load(inputStream);
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
Class.forName(driver);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
// 获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
// 释放资源
public static void release(Connection connection, Statement statement, ResultSet resultSet) throws SQLException {
if(resultSet != null) {
resultSet.close();
}
if(statement != null) {
statement.close();
}
if(connection != null) {
connection.close();
}
}
}
public class JdbcTest {
public static void main(String[] args) throws SQLException {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
String sql = "select * from studentpre where id = ?";
// 预编译SQL,防止SQL注入
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 6);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
System.out.println(resultSet.getString("name") +
resultSet.getInt("age") +
resultSet.getInt("id"));
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JdbcUtils.release(connection,preparedStatement,resultSet);
}
}
}
public class JdbcTest {
public static void main(String[] args) throws SQLException {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
// 关闭自动提交,并开启事务
connection.setAutoCommit(false);
String sql = "insert into studentpre values(?,?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 6);
preparedStatement.setString(2, "张三");
preparedStatement.setInt(3, 18);
preparedStatement.executeUpdate();
int i = 1 / 0;
preparedStatement.setInt(1, 7);
preparedStatement.setString(2, "李四");
preparedStatement.setInt(3, 19);
preparedStatement.executeUpdate();
// 提交事务
connection.commit();
} catch (SQLException e) {
// 回滚事务
connection.rollback();
throw new RuntimeException(e);
} finally {
JdbcUtils.release(connection, preparedStatement, resultSet);
}
}
}
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。数据库连接池在初始化时将创建多个数据库连接并将它们存储在一个池中。当应用程序需要访问数据库时,可以从池中获取一个可用的连接,使用完毕后再将连接返回到池中,而不是关闭连接。这样可以减少数据库连接的创建和销毁的开销,提高应用程序的性能。
数据库连接池的实现通常包括以下几个步骤:
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/schoolproperty>
<property name="user">rootproperty>
<property name="password">123456property>
<property name="initialPoolSize">10property>
<property name="minPoolSize">10property>
<property name="acquireIncrement">5property>
<property name="maxPoolSize">100property>
<property name="maxIdleTime">30property>
default-config>
c3p0-config>
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class C3P0Utils {
private static DataSource dataSource;
static {
try {
dataSource = new ComboPooledDataSource();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 获取连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
// 释放资源
public static void release(Connection connection, Statement statement, ResultSet resultSet) throws SQLException {
if(resultSet != null) {
resultSet.close();
}
if(statement != null) {
statement.close();
}
if(connection != null) {
connection.close();
}
}
}
import java.sql.*;
public class JdbcTest {
public static void main(String[] args) throws SQLException {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = C3P0Utils.getConnection();
connection.setAutoCommit(false); // 关闭自动提交并开启事务
String sql = "insert into studentpre values(?,?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(2, "李白");
preparedStatement.setInt(3, 1000);
preparedStatement.setInt(1, 11);
preparedStatement.executeUpdate();
connection.commit();
} catch (Exception e) {
connection.rollback();
System.out.println("没有提交成功,事务回滚");
throw new RuntimeException(e);
} finally {
C3P0Utils.release(connection,preparedStatement,resultSet);
}
}
}
笔记总结于视频:https://www.bilibili.com/video/BV1NJ411J79W?spm_id_from=333.788.videopod.episodes&vd_source=16bf0c507e4a78c3ca31a05dff1bee4e