# spring_web **Repository Path**: moonshinean/spring_web ## Basic Information - **Project Name**: spring_web - **Description**: spring boot 学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-10 - **Last Updated**: 2024-08-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 一、Spring 相关 #### 1、依赖注入的注解 - @Autowired 默认按照类型自动装配 - 如果同类型的bean存在多个。可以采用以下方式 - @Primary 注解,可以指定首选的bean - @Autowired + @Qualifier("bean的名称") 注解 - @Resource(name="bean的名称") 注解 #### 2、@Resource注解 和 @Autowired注解的区别 - @Autowired注解是spring框架提供的注解,而@Resource注解是JDK提供的注解。 - @Autowired注解默认按照类型注入,而@Resource注解默认按照名称注入。 ## 二、数据库相关 #### 1、SQL语句通常分为四大类 | 分类 | 全称 | 说明 | |-----|----------------------------|-----------------------------| | DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) | | DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 | | DQL | Data Query Language | 数据查询语言, 用来查询数据库中表的记录 | | DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 | #### 2、DDL(数据库操作) ##### **(1)、查询** - 查询所有数据库: show databases; - 查询当前数据库: select database(); ##### **(2)、使用** - 使用数据库: use 数据库名; ##### **(3)、创建** - 创建数据库: create database 数据库名; ##### **(4)、删除** - 删除数据库: drop database [if exists] 数据库名; #### 3、数据库表约束 | 约束 | 描述 | 关键字 | |------|--------------------------|---------------------------------| | 非空约束 | 限制该字段值不能为null | not null | | 唯一约束 | 保证字段的所有数据都是唯一,不重复的 | unique | | 主键约束 | 主键是一行数据的唯一标识、要求非空且唯一 | primary key(auto_increment 自增) | | 默认约束 | 保存数据时、如果未指定该字段值,则采用默认 | default | | 外键约束 | 让两张表的数据建立连接,保证数据的一致性和完整性 | foreign key | #### 4、DDL(表操作) ##### **(1)、查询** - 查询所有表: show tables; - 查询表结构: desc 表名; ##### **(2)、更新** - 添加字段:alter table 表名 add 字段名 类型(长度) [comment '注释'] [约束]; - 修改字段类型:alter table 表名 modify 字段名 新数据类型(长度); - 修改字段名和类型:alter table 表名 change 旧字段名 新字段名 类型(长度) [comment '注释'] [约束]; - 删除字段:alter table 表名 drop column 字段名; - 修改表名:rename table 旧表名 to 新表名; - 删除表:drop table if exists 表名; > 删除表的时候 里面所有的数据都会被删除,慎用! #### 5、DML(数据操作) ##### **(1)、插入** - 插入指定数据: insert into 表名 (字段1,字段2,...) values (值1,值2,...); - 插入全部数据: insert into 表名 values (值1,值2,...); - 批量插入数据: insert into 表名 (字段1,字段2,...) values (值1,值2,...),(值1,值2,...),(值1,值2,...); - 批量全部插入数据: insert into 表名 values (值1,值2,...),(值1,值2,...),(值1,值2,...); > 注意:插入数据时,指定的字段顺序需要与值顺序是一一对应的。 > 字符串和日期数据应该包含在引号中 > 插入的数据大小,应该在字段的规定范围内。 ##### **(2)、更新** - 更新指定数据: update 表名 set 字段1=值1,字段2=值2,... [where 条件]; - 更新全部数据: update 表名 set 字段1=值1,字段2=值2,...; > 注意:修改语句的条件可有可无,如果没有条件,则会更新全部数据。 ##### **(3)、删除** - 删除指定数据: delete from 表名 [where 条件]; - 删除全部数据: delete from 表名; > 注意:删除语句的条件可有可无,如果没有条件,则会删除全部数据。 > Delete语句不能删除某一个字段的值(如果要操作,可以使用Update语句,将字段值设置为null) #### 6、DQL(查询操作) ##### **(1)、查询** - 查询指定数据: select 字段1,字段2,... from 表名; - 查询全部数据: select * from 表名; - 设置别名:select 字段1 [as 别名1], 字段2 [as 别名2],... from; - 去重复记录:select distinct 字段1,字段2,... from 表名; > 注意:*代表查询所有字段,在实际开发中尽量少用(不直观,影响效率)。 ##### **(2)、条件查询** - 等于: select 字段1,字段2,... from 表名 where 字段名=值; - 不等于: select 字段1,字段2,... from 表名 where 字段名!=值; - 大于: select 字段1,字段2,... from 表名 where 字段名>值; - 大于等于: select 字段1,字段2,... from 表名 where 字段名>=值; - 小于: select 字段1,字段2,... from 表名 where 字段名<值; - 小于等于: select 字段1,字段2,... from 表名 where 字段名<=值; - 范围查询: select 字段1,字段2,... from 表名 where 字段名 between 值1 and 值2; - 空值查询: select 字段1,字段2,... from 表名 where 字段名 is null; - 非空值查询: select 字段1,字段2,... from 表名 where 字段名 is not null; - 多条件查询: select 字段1,字段2,... from 表名 where 字段名1=值1 and 字段名2=值2; - 多条件查询: select 字段1,字段2,... from 表名 where 字段名1=值1 or 字段名2=值2; - 子查询: select 字段1,字段2,... from 表名 where 字段名 in (select 字段名 from 表名2); | 比较运算符 | 功能 | |-------------------|-----------------------| | > | 大于 | | >= | 大于等于 | | < | 小于 | | <= | 小于等于 | | = | 等于 | | != 或 <> | 不等于 | | between ... and... | 在某个范围之内(含最小、最大值)范围查询 | | in(...) | 在 in 之后的列表的值,多选一 | | like | 模糊匹配(_代表单个字符,%代表任意字符) | | is null | 空值查询 | | is not null | 非空值查询 | | and 或者 && | 并且, 多个条件同时满足 | | or 或者 `\|\|` | 或者,多个条件满足其一 | | not 或者 ! | 非,不是 | > 注意:条件查询时,字段名和值需要用引号包裹。 ##### **(3)、分组查询** - 分组查询: select 字段1,字段2,...,函数(字段3) from 表名 group by 字段1,字段2 【having 条件】; > where 与 having的区别 - 执行时机不同,where是在检索数据之前进行条件过滤,不满足where条件,不参与分组,having是在分组之后进行条件过滤,不满足having条件,不显示 - 判断条件不同,where不能对聚合函数进行判断,而having可以。 > 注意: - 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。 - 执行顺序,where > 聚合函数 > having **聚合函数:** | 函数 | 功能 | |-------|-----------------| | count | 统计数量,不对null做统计的 | | max | 最大值 | | min | 最小值 | | avg | 平均值 | | sum | 求和 | ##### **(4)、排序** - 升序排序(默认): select 字段1,字段2,... from 表名 order by 字段1 asc,字段2 desc; - 降序排序: select 字段1,字段2,... from 表名 order by 字段1 desc,字段2 asc; > 注意 - 如果是多个字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。 ##### **(5)、分页** - 分页查询:select 字段1,字段2,... from 表名 limit 起始索引,查询记录数; > 注意: - 起始索引从0开始,起始索引 = (查询页面-1)* 查询记录数 - 分页查询是数据库的方言,不同数据库有不同的实现,Mysql使用LIMIT。 - 如果查询的是第一页的数据,起始索引可以省略,直接简写为 limit 10; #### 7、外键 ##### (1)、(物理外键)** 严禁使用 ** - 概念:使用foreign key 定义外键关联另外一张表 - 缺点: - 影响增、删、改的效率(需要检查外键关系) - 仅用于单节点数据库,不适用于分布式、集群场景 - 容易引发数据库的死锁问题,消耗性能。 ##### (2)、 逻辑外键 **(推荐)** - 概念:在业务逻辑层中,解决外键关联。 - 通过逻辑外键,就可以很方便解决上述问题。 #### 8、多表查询 ##### (1)、连接查询 - 内连接:相当于查询A、B交集部分数据 - 外链接 - 左外连接:查询左表所有数据包括两张表交集的部分 - 右外连接:查询右表所有数据包括两张表交集的部分 - 隐士内连接:select 字段列表 from 表1,表2 where 条件...; - 显士内连接:select 字段列表 from 表1 [inner] join 表2 on 连接条件...; - 左外连接:select 字段列表 from 表1 left [outer] join 表2 on 连接条件...; - 右外连接:select 字段列表 from 表1 right [outer] join 表2 on 连接条件...; ##### (2)、子查询 概述:SQL语句中嵌套select 语句,称为嵌套查询,又叫子查询。 形势:select * from t1 where column = (select column from t2) - 标量子查询:子查询返回的结果为单个值 - 子查询返回的结果是单个值(数据、日期、字符串等),最简单的形式。 - 常用的操作符:= <> > >= < <= - 列子查询:子查询返回结果为一列 - 子查询返回的结果是一列可以是多行 - 常见的操作符:in,not in等 - 行子查询:子查询返回结构为一行 - 常见操作符:=、<>、in、not in - 表子查询:子查询返回结果为多行多列 - 子查询返回结果为多行多列,常作为临时表 - 常用操作符:in #### 9、事务 **概念** 事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或者撤销操作请求,即这些操作要么同时成功、要么同时失败 > 注意事项: 默认mysql的事务是自动提交的,也就是说,当执行一条DML语句,Mysql会立即隐式的提交事务 **事务控制** - 开始事务:start transaction; / begin ; - 提交事务:commit; - 回滚事务:rollback; ##### (1)、四大特性 - 原子性:事务是不可分割的最小单位,要么全部成功、要么全部失败。 - 一致性:事务完成时,必须所有的数据都保持一致状态 - 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行 - 持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久性的。 #### 10、索引 **索引**是帮助数据库 高效获取数据的数据结构。 ##### (1)、优缺点 **优点** - 提升数据查询的效率,降低数据库的IO成本。 - 通过索引列对数据进行排序,降低数据排序的成本,降低cpu消耗 **缺点** - 索引会占用存储空间 - 索引大大提高了查询效率,同时也降低了insert、update、delete的效率。 ##### (2)、结构 **B+Tree 多路平衡搜索树** - 每个节点可以存储多个key(有n个key就有n 个指针) - 所有的数据都存储在叶子节点,非叶子节点仅用于索引数据 - 叶子节点形成一颗双向链表,便于数据的排序以及区间范围查询。 ##### (3)、语法 - 创建语法:create [unique] index 索引名称 on 表名(字段名...) - create index idx_emp_name on tb_emp(name) - 查看索引:show index from 表名称; - show index from tb_emp - 删除索引:drop index 索引名称 on 表名; - drop index idx_emp_name on tb_emp > 注意:主键字段,在建表时,会自动创建主键索引 > 添加唯一约束时,数据库实际上会添加唯一索引。 #### 11、数据库 连接池 - 数据库连接池是一个容器,负责分配管理数据库连接 - 它允许应用程序重复使用一个现有的数据库连接,而不是在重新建立一个 - 释放空闲时间超过最大空间的连接,来避免因为没有释放连接而引起的数据库连接遗漏 **优势** - 资源重用 - 提升系统相应速读 - 避免数据库连接遗漏 #### xml映射文件 规范 - xml映射文件的名称与mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同的包下(同包同名) - XML映射文件的namespace属性为Mapper接口全限定名一致 - XML映射文件中的sql语句的id 与 mapper接口的方法名一致,并保持返回类型一致。