什么是数据库:
存储数据的仓库,其本质是一个文件系统,数据库按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
数据的存储方式:
1)内存中
- 优点:读写速度快。
- 缺点:数据不能永久存储,断电或程序重新运行就没有了。
2)文件中
- 优点:可以永久性保存数据。
- 缺点:读写速度慢,查询,删除,修改不方便。
3)数据库中
- 永久保存了,可以使用SQL语句方便进行增删改查操作。
数据库类型:
- 关系型数据库。 MYSQL、Oracle都是关系型数据库。
- 非关系型数据库。
常见的数据库:
常用的数据库:
- MYSQL
- Oracle
在web应⽤用中,使⽤用的最多的就是MySQL数据库,原因如下:
- 开源、免费。
- 功能足够强大,足以应付web应用开发(最高支持千万级别的并发访问)。
MYSQL目录结构:
│-- bin:MySQL所有相关的可执行文件。
│-- MySQLInstanceConfig.exe
│-- data: MySQL默认的数据库
│-- include: C语言相关的头文件
│-- lib: C++相关的动态链接库
│-- my.ini MySQL的配置文件
关闭MYSQL服务:
方式一:
- 控制面板——系统与安全——管理工具——服务——搜索mysql,然后关闭。
方式二:通过控制台窗口关闭与开启
- 关闭mysql服务器: net stop mysql
- 开启mysql服务器: net start mysql
控制台登录和退出数据库:
方式1:连接本地的机器
- 格式:mysql -u用户名 -p密码
方式2:连接其他的数据库服务器
- 格式:mysql -hIP地址 -p回车 再输入密码
方式3:适用于本机
- 格式:mysql -u用户名 -p回车 再输入密码
退出数据库
- exit 或 quit
数据库管理系统(DataBase Management System,DBMS):
指一种操作和管理数据库的大型软件,用于建立,使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性,用户通过数据库管理系统访问数据库中表内的数据。
在实际开发中,一个项目对应一个数据库:
- 一个数据库服务器中可以有多个数据库
- 一个数据库中可以有多张表
- 一张表中可以有n条记录数
数据库备份
备份的应用场景:
在实际开发中,假如某天我们的数据库的数据被人误删了,那么数据就完全丢失了,所以我们一般需要对数据库的数据进行备份。
source命令备份与还原:
mysqldump -u用户名 -p密码 数据库 > 文件的路径
- 注意:数据库备份是没有创建数据库的语句的,只有创建表与插入数据的语句。
还原格式:
- 先登录
- 选择指定的数据库: use 数据库名;
- 使用source导入数据库文件: source 导入文件的路径;
还能在图形化界面备份与还原。
表关系
1)一对多关系(最常见)
解决方案:
- 在多的一方建立外键关系,引用主表的主键。
2)多对多(常见)
解决方案:
- 创建一张中间表。
- 创建外键列。
- 并且把外键列设置为联合主键。
- constraint foreign key(rid) references tab_route(rid),
constraint foreign key(uid) references tab_user(uid),
primary key(rid,uid)
3)一对一(不常见)
解决方案:
- 建立外键的关系。
- 并且吧外键列设置为唯一。
表与表之间的三种关系 | 说明 |
一对多 | 最常用,如果有两张表A和B,如堕A与B是一对多的关系。表示A表中一条记录对应B表中多条记录,B表中一条记录对应A表中的一条记录。 如:部门与员工 |
多对多 | A表中一条记录对应B表中多条记录,反之,B表中一条记录也对应A表中多条记录。 如:老师与学生 |
一对一 | 比较少使用,A表中一条记录对应B表中一条记录。 如:身份证信息表居民表信息 |
数据库三范式
什么是范式:
范式就是规则,一套用来设计表的规则。
范式的基本分类:
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- 巴斯-科德范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF)
一般说来,数据库只需满足第三范式(3NF)就行了。
第一范式:
- 要保证每一列的原子性,每一列都是不可再分割的。
总结:如果不遵守第⼀范式,查询出数据还需要进⼀步处理(查询不方便)。遵守第一范式,需要什么字段的数据就查询什么数据(方便查询)。
第二范式:
- 表必须有主键。
- 一张表只描述一件事情。
- 总结:如果不遵守第二范式,数据冗余,相同数据无法区分。遵守第二范式减少数据冗余,通过主键区分相同数据。
第三范式:
- 从表的外键必须使用主表的主键。(一个关系中不包含已在其他关系已包含的非主键字信息)
总结:如果不遵守第三范式,可能会有相同数据无法区分,修改数据的时候多张表都需要修改(不方便修改)。遵守第三范式通过id可以区分相同数据,修改数据的时候只需要修改一张表(方便修改)。
事务安全(TCL)
什么是事务:
将一个业务操作相关的多条SQL语句当成一个整体对待,这多条SQL语句要么全部执行成功,要么全部执行失败。
事务的应用场景说明:
在实际的业务开发中,有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。需要讲多次访问数据库的操作视为一个整体来执行,要么所有SQL语句全部执行成功。如果其中有一条SQL语句失败,就进行事务的回滚,所有的SQL语句全部执行失败。
事务在java中的应用场景:
/*使用jdbcTemplate操作sql事务控制*/
//事务:保证多条sql语句,全部执行成功才可以提交事务,有一个sql语句错误就全部回滚,保证数据统一性
//事务实现,必须操作同一个连接对象,设置为不自动提交事务,待所有sql语句执行完毕,不发生错误再提交这个连接的事务,如果发生错误进行回滚
//同时操作多条增删改sql语句,需要使用事务
//获取数据源
DataSource dataSource = JdbcUtils.getDataSource();
//实例jdbcTemplate, 如果想一个事务操作多条sql语句,需要同一个jdbcTemplage
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//启动事务管理器(获取datasource操作数据库连接对象并绑定到当前线程中)
TransactionSynchronizationManager.initSynchronization();
//从数据源中获取jdbcTemplate操作的当前连接对象
Connection connection = DataSourceUtils.getConnection(dataSource);
try {
//设置连接不自动提交事务
connection.setAutoCommit(false);
//多条增删改sql执行
//手动提交事务
connection.commit();
} catch (Exception e) {
//事务回滚
connection.rollback();
System.out.println("回滾了");
throw e;//抛出异常,说明执行失败
} finally {
try {
//释放当前线程与连接对象的绑定
TransactionSynchronizationManager.clearSynchronization();
//重置当前连接为自动提交事务
connection.setAutoCommit(true);
} catch (Exception e) {
e.printStackTrace();
}
}
MYSQL中可以有两种方式进行事务的操作:
- 手动提交事务
- 自动提交事务
- mysql的事务自动提交而Oracle事务不自动提交。
手动提交事务:事务相关的命令:
- 开启事务 start transaction;
- 回滚事务 rollback;
- 提交事务 commit;
自动提交事务:
MYSQL的每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,执行完毕自动提交事务,MYSQL默认开始自动提交事务。
查看当前事务提交的方式:
show variables like '%commit%'
- 查询事务提交相关的所有变量。
修改事务提交的方式:
set autocommit = 0;
- 关闭事务自动提交。
set autocommit = 1;
- 开启事务自动提交。
事务原理:
事务开启之后, 所有的操作都会临时保存到事务日志, 事务日志只有在得到`commit`命令才会同步到数据表中,其他任何情况都会清空事务日志(rollback,断开连接)。
回滚点:
设置回滚点语法:
- savepoint 回滚点名字;
回到回滚点语法:
- rollback to 回滚点名字;
事务的四大特性(ACID):
事务特性 | 含义 |
原子性: A | 事务中多条SQL语句是一个整体, 要么全部执行成功,要么全部执行失败。 |
一致性: B | 事务前后的数据要保持一致。 |
隔离性: I | 多个事务之间操作不能相互影响。 |
持久性: D | 事务一但提交,对数据库的数据影响是永久的。 |
事务的隔离级别:
事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题。
并发访问的问题 | 含义 |
脏读 | 一个事务读取到了另一个事务未提交的数据。 |
不可重复读 | 一个事务前后读取到的数据内容不一致,应该在同一个事务中多次读取数据都是相同的,一般是由update引起的。 |
幻读(虚读) | 一个事务前后查询数量得到不一样的结果,产生幻觉不知道那一次结果是正确的。一般是由insert或delete引起的。 (MYSQL没有幻读,Oracle才有) |
数据库中的隔离级别:
read uncommitted | 读取没有提交的数据。 |
read committed | 读取提交的数据。 解决脏读,但是不能解决不可重复读。 Oracle和SQL Server默认隔离级别。 |
repeatable read | 可重复读(MYSQL默认隔离级别) 解决不可重复读,但是不能解决幻读。 (幻读在MYSQL不存在,默认就已经解决了) |
serializable | 串行化。 解决全部的问题。 |
MYSQL事务隔离级别相关的命令:
1)查询全局事务隔离级别:
show variables like '%isolation%';
-- 或
select @@tx_isolation;
2)设置事务隔离级别,需要退出登录,然后重新连接才可以生效。
set global transaction isolation level 级别字符串串;
-- 如:
set global transaction isolation level read uncommitted;
DCL
DCL语句的作用:
用于创建用户、删除用户,分配、删除权限给用户,修改密码。
创建用户:
CREATE USER '⽤用户名'@'主机名' IDENTIFIED BY '密码';
- 用户名:将创建的用户名。
- 主机名:指定该用户在哪个主机上可以登录,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登录,可以使用通配符%。
- 密码:该用户的登录密码,密码可以为空,如果为空则该用户可以不需要密码登录服务器。
授权用户:
GRANT 权限1, 权限2... ON 数据库名.表名 TO '用户名'@'主机名';
撤销授权:
REVOKE 权限1, 权限2... ON 数据库.表名 FROM '⽤用户名'@'主机名';
权限:select、delete、insert、update、drop、create、all、alter
all:代表所有权限
*代表所有数据库
*代表所有表
查看权限:
SHOW GRANTS FOR '用户名'@'主机名';
删除用户:
DROP USER '用户名'@'主机名';
修改管理员密码(非登录的情况下去使用的):
mysqladmin -u用户名 -p password 新密码 回车 原密码
- 修改管理员密码需要使用到mysql自带的工具mysqladmin。
修改普通用户密码(需要在登录的情况下去使用):
set password for '用户名'@'主机名' = password('新密码');