Spring框架基础

Spring框架入门和依赖注入

关系型数据库、SQl、MySQL、Redis

SQL、MySQL、Redis这三块的东西太多了,课件很多东西只讲了皮毛,倒是放了很多视频、博客链接+推荐书籍(很多学长倾力推荐的

  • SQL:《必知必会SQL》、很多讲MySQL的视频会连带讲SQL用法
  • MySQL:尚硅谷MySQL视频(巨细)、黑马MySQL视频(黑马尚硅谷选一个看即可)、MySQL45讲(极客时间)、《MySQL技术内幕:InnoDB存储引擎》
  • Redis:黑马Redis视频、《Redis设计与实现》

时间和知识有限,大家目前对这一块的要求就是会用常用的SQL语句操作MySQL,知道MySQL、Redis是拿来干嘛的

关系型数据库

讲到MySQL,它是一种关系型数据库(基于关系模型的数据库,它通过表格的形式存储和管理数据

以下是我们了解关系型数据库的一些必知必会的新概念:

数据库(Database)可以理解是一种特殊格式的数据文件

  • 数据以一种特殊组织形式的二进制格式存储在数据库中

数据库管理系统(Database Management System)是对数据库进行管理的一组软件系统

结构化查询语言(Struct Query Language,SQL),是一种允许我们在关系型数据库系统上查询和操作数据的语言

开发者通过SQL -> 数据库管理系统 -> 操作系统 -> 数据库(文件)

关键术语:

  • 表:也称关系表,表是数据库中存储数据的组织形式

  • 字段:即表中的列,也称为属性

  • 记录:即表中的行,一行数据称为一条记录

  • NULL值:null表示不存在的值,或暂时未知的值

    • null不是空字符串
    • null与其他值进行运算,结果总为null
  • 键:

    • 超键:能唯一标识记录的属性集

    • 候选键:属于超键,是不含多余属性的超键,是最小的超键

    • 主键:属于候选键,能唯一标识记录的一个字段或者多个字段的组合

      • 主键是唯一的
      • 主键不能为null
    • 唯一键:一个或多个字段的集合,唯一标识数据库表中的数据

      • 防止列中的复制值
      • 列中只能有一个null
      • 一个表中可以有多个唯一键
    • 外键:建立与其他表的联系,一个表中的某些字段是另外表的主键或唯一键,这些字段称为外键

      • 外键可以为null

      • 外键也可以是本表的原有字段

视图:

  • 视图就是把查询存放成数据库的一个对象,即视图对象
  • 视图是一个虚表,不存储具体的数据,因此一旦基本表中的数据发生变化,从视图查询出的数据也随之改变了
  • 视图是采用select语句来构造的,在当一个视图的时候,只是把其定义存放在系统的数据字典中,直到用户使用视图时才去求对应的数据
  • 视图只保存了查询的SQL逻辑,不保存查询结果

触发器:

  • 触发器是存储在数据库中的一组SQL语句,每当与表相关联的事件发生时,就会触发SQL执行,例如:增,删,改
  • 触发器是与表相关的命名数据库对象,每当表上出现特定事件时,将激活该对象
  • 触发器由数据库系统自动执行,无需程序员手动调用
  • 优点:
    1. 帮助记录操作日志‘
    2. 对操作前进行数据合法性检验
  • 缺点:
    1. 可读性差
    2. 增加性能开销

存储过程:

  • 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。并在数据库内执行
  • 是一组为了完成特定功能的SQL集合
  • 经编译以后保存在数据库中
  • 可带参数,也可返回结果

数据库设计:

  • ER模型:

    • 实体(Entity),关系(Relationship)
    • 实体:将现实世界事务特征抽象为数据库表,一个表就是一个实体
    • 数据库中实体之间的关系通过外键来关联
  • 设计范式:

    • 第一范式:

      表中的字段是原子的,不可分割的

    • 第二范式:

      表中要有主键

    • 第三范式:

      消除部份依赖和传递依赖

索引:

  • 索引概念:

    通过数据库索引,可以快速的检索到记录在磁盘中的具体位置

    当表中的数据非常多时,可以使用索引来提高查询数据的效率

    数据库索引的最主要作用是为了提高查询性能

    概念:

    1. 索引是对数据表中一列或多列的值进行排序的一种结构,可提高待定数据的查询速度
    2. 索引是一个单独的、存储在磁盘上的数控结构文件,包含着数据表中所有记录的引用指针

    索引作用:

    1. 索引中的属性值必须有序,则可以通过二分查找的方式快速定位到数据文件的磁盘地址
    2. 如果没有索引,查询将会全表扫描,导致性能急速下降
  • 索引物理结构划分:

    索引可分为:

    1. 顺序索引
    2. B树索引
    3. 哈希索引

    商用数据库的索引主要是后两者

事务:

简单理解:一组SQL在事务中执行,要么全部成功,要么全部失败

事务是一个逻辑工作单元,有四个特性

ACID特性:

  1. 原子性(Atomicity):

    事务是一个原子操作,不可分割,要么全部成功,要么全部失败,部分失败会回滚

  2. 一致性(Consistency):

    事物的执行必须使数据库从一个一致状态转换到另一个状态。这意味着事务必须满足所有约束条件,以保持数据的完整性和一致性

  3. 隔离性(Isolation):并发事务的执行不能相互干扰

  4. 持久性(Durability):一旦事务完成提交,其结果就是永久性的

SQL:

前面我们说到要用SQL去操作关系型数据库

详细操作可以看一下**《必知必会SQL》**

我们常听说的后端工程师是CRUD工程师,是跟数据打交道的

那么CRUD是什么呢?

CRUD即Create(新增)、Read(读取)、(Update)更新、(Delete)删除

SQL语句用法很多,时间有限,我们今天只讲最常用的增删改查操作

  1. 登录mysql
1
mysql -uroot -p
  1. 查看所有数据库
1
show databases
  1. 创建我们这节课的数据库lesson5
1
create lesson5
  1. 使用某个库
1
use 库名
  1. 查看库的所有表
1
show tables from 数据库
  1. 创建表student
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
-- 创建一张学生表
drop table if exist student;
create table student (
   id int,
   sn int comment '学号',
   name varchar(20) comment '姓名',
   qq_mail varchar(20) comment 'QQ邮箱'
);
 
-- 单行数据+全列插入  插入两条记录,value_list 数量必须和定义表的列的数量及顺序一致
insert into student values (100, 10000, '唐三藏', NULL);
insert into student values (101, 10001, '孙悟空', '11111');
 
-- 多行数据+指定列插入  插入两条记录,value_list 数量必须和指定列数量及顺序一致
insert into student (id, sn, name) values
 (102, 20001, '曹孟德'),
 (103, 20002, '孙仲谋');
  1. 查看表student
1
SELECT * FROM student;

好了前戏做完了,我们来对这张表做CRUD:

  1. 查询student表中的数据(SELECT):

    sql

1
SELECT * FROM student;

或者查询特定的列:

sql

1
SELECT id, name, qq_email FROM student;
  1. 插入数据到student表中(INSERT):

    sql

1
INSERT INTO student (id, name, qq_email) VALUES (1, 'John Doe', 53425234523@qq.com);
  1. 更新student表中的数据(UPDATE):

    sql

1
UPDATE student SET qq_email = 53425234523@qq.com WHERE id = 1;
  1. 删除student表中的数据(DELETE):

    sql

1
DELETE FROM student WHERE id 

MySQL:

mysql 、redis这些都是工具,我们需要学会的是怎么玩它,玩的顺心

在我们日常项目开发中,会用到ORM框架去操作数据库

常见的ORM框架:Mybatis(最重要,最常用,大多公司里会采用的)、MybatisPlus(开发便捷,不宜维护,个人项目开发可用)

贴个链接,想看自己看 https://blog.csdn.net/2302_80742310/article/details/139234954?spm=1001.2014.3001.5502

但会用也不够,还要懂得其中的原理

1
show databases;

通过这条命令,我们得以看到MySQL软件自带的数据库

有4个数据库是属于MySQL自带的系统数据库:

mysql MySQL 系统自带的核心数据库,它存储了MySQL的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等

information_schema MySQL 系统自带的数据库,这个数据库保存着MySQL服务器 维护的所有其他数据库的信息 ,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引。这些信息并不是真实的用户数据,而是一些描述性信息,有时候也称之为 元数据 。在系统数据库 information_schema 中提供了一些以innodb_sys 开头的表,用于表示内部系统表。

performance_schema MySQL 系统自带的数据库,这个数据库里主要保存MySQL服务器运行过程中的一些状态信息,可以用来 监控 MySQL 服务的各类性能指标 。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等信息。

sys MySQL 系统自带的数据库,这个数据库主要是通过 视图 的形式把 information_schema 和performance_schema 结合起来,帮助系统管理员和开发人员监控 MySQL 的技术性能

索引、事务、日志原理、InnoDB、引擎、锁、MVCC

这些是MySQL中需要重点了解的原理、也是以后简历上放的东西

有空下来自己学

Redis:

简介

Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,其有以下特点。

  • Redis是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在IO上,所以读取速度快
  • Redis使用的是非阻塞 IO,IO 多路复用,使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换和竞争。
  • Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。
  • Redis存储结构多样化,不同的数据结构对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。
  • Redis采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。

上面我们了解了关系型数据库MySQL,现在轮到了非关系型据库(NoSQL)**Redis ** 。

NoSQL= Not Only SQL (不仅仅是SQL)泛指非关系型数据库

那什么是关系型数据库,什么是非关系型数据库呢❔

关系型据库:关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织,其遵循ACID原则

优点: 1、易于维护:都是使用表结构,格式一致;2、使用方便:有通用的SQL语言;3、支持复杂操作:多个表之间做繁杂的查询。 缺点: 1、读写性能比较差,尤其是海量数据的高效率读写;2、固定的表结构,灵活度稍欠;3、高并发读写有IO瓶颈。

常见的有 MySQL/Oracle/SQL Server/Sqlite/TiDB/PostgreSQL/MariaDB

非关系型据库:

一般 除了主流的关系型数据库外的数据库,都认为是非关系型。

优点: 1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式。2、速度快:NoSQL可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;3、高扩展性;4、成本低。

缺点: 1、一般而言没有太强的事务处理;2、数据结构相对复杂,复杂查询方面稍欠。

常见的有 Redis / HBase /MongoDB /CouchDB /Neo4J

数据结构:

数据结构:https://juejin.cn/post/7392071148752388148?searchId=20241201150826602A15607606B84B2444、

我是看《Redis设计与实现》和黑马Redis来学的这个redis数据结构

命令

https://juejin.cn/post/7270114845402660903?searchId=2024120115195842E7CDE2922B79529C57 命令较MySQL简单,自己下来看

缓存三兄弟、IO模型:

缓存穿透:请求的数据在数据库和缓存中都不存在,这样的请求永远打到数据库上

缓存击穿:某个热点key缓存突然失效,导致大量请求瞬间打到数据库

缓存雪崩:大量key同时失效,或redis宕机,导致大量请求打到数据库

三种缓存问题的解决方案大家下来学习,黑马Redis也在用代码进行讲解

IO模型https://zhuanlan.zhihu.com/p/614204046

蛮有意思的,有空下来看

实现功能

后面大家做项目来实现功能的时候,如果遇到以下场景,可用想到Redis:

缓存(建议)

消息队列(不建议)

延迟消息(不建议)

排行榜(建议)

计数器(建议)

分布式ID(可以)

分布式锁(建议)

地理位置应用(建议)

分布式限流(可以)

分布式Session(建议)

布隆过滤器(建议)

bitmap状态统计(可以)

共同关注(建议)

推荐关注(可以)

最后修改 September 22, 2025: fix:fix all problem (1f7c860)