JavaWeb基础
HTTP协议
HTTP
- 概念:HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
- 特点:
- 基于TCP协议:面向连接,安全
- 基于请求-相应模型:一次请求对应一次响应
- HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
- 缺点:多次请求之间不能共享数据
- 优点:速度快
HTTP请求协议
HTTP响应协议
Tomcat基本使用
请求响应
请求响应-请求
Postman
作用:常用于进行接口测试。
简单参数
-
原始方式
在原始的Web程序中,获取请求参数,需要通过HttpServletRequest 对象手动获取。
-
SpringBoot方式
简单参数:参数名与形参变量名相同,定义形参即可接收参数。
简单参数:如果方法形参名称与请求参数名称不匹配可以使用 @RequestParam 完成映射。
实体参数
- 简单实体对象:请求参数与形参对象属性名相同,定义POJO接收即可。
数组集合参数
- 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数。
- 集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam 绑定参数关系。
日期参数
- 日期参数:使用 @DateTimeFormat 注解完成日期参数格式转换。
Json参数
- Json参数:Json数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用 @RequestBody 标识。
路径参数
路径参数:通过请求URL直接传递参数,使用{...}来标识该路径参数,需要使用 @PathVariable 获取路径参数。
请求响应-响应
响应数据
统一响应结果
分层解耦
三层架构
分层解耦
-
内聚:软件中各个功能模块内部的功能联系。
-
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
-
软件设计原则:高内聚低耦合。
IOC&DI入门
步骤 · IOC&DI 入门
1、Service层 及 Dao层的实现类,交给IOC容器管理。
加入注解 @Component
2、为Controller 及 Service 注入运行时,依赖的对象。
加入注解@Autowried
3、运行测试。
Bean的声明
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:
注意事项:
- 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
- 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用 @Controller。
Bean组件扫描
- 前面声明bean的四大注解,要想生效,还需要被组件扫描注解 @ComponentScan 扫描。
- @ConponentScan 注解虽然没有显示配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication中,默认扫描的范围是启动类所在包及其子包。
Bean注入
- @Autowired 注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:
-
通过一下几种方案来解决:
- @Primary
- @Qualifier
- @Resource
@Resource 与 @Autowired 区别
-
@Autowired 是spring框架提供的注解,而@Resource 是JDK提供的注解。
-
@Autowired 默认是按照类型注入,而@Resource 默认是按照名称注入。
数据库(MySQL)
-
数据库:DataBase(DB),是存储和管理数据的仓库。
-
SQL:Structured Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。
MySQL-企业开发使用方式
MySQL数据模型
- 关系型数据库(RDBMS):建立在关系模型基础上,由多张互相连接的二维表组成的数据库。
特点:
- 使用表存储数据,格式统一,便于维护
- 使用SQL语言操作,标准统一,使用方便,可用于复杂查询。
SQL分类
数据库设计-DDL
DDL英文全称是 Data Defination Language,数据定义语言,用来定义数据库对象(数据库、表)。
DDL(数据库操作)
注意事项:上述语法中的database,也可以替换成 Schema。如:create schema db01。
DDL(表操作)
约束
- 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
- 目的:保证数据库中数据的正确性、有效性和完整性。
数据类型
MySQL中的数据类型由很多,主要分为三类:数值类型、字符串类型、日期时间类型。
数值类型
字符串类型
时间日期类型
数据库操作-DML
DML英文全称是 Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。
添加数据(INSERT)
注意事项:
1、插入数据是,指定的字段顺序需要与值的顺序是一一对应的。
2、字符串和日期型数据应该包含在引号中。
3、插入的数据大小,应该在字段的规定范围内。
修改数据(UPDATE)
注意事项:修改语句的条件可以由,也可以没有,如果没有条件,则会修改整张表的所有数据。
删除数据(DELEFE)
注意事项:
1、DELEFE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
2、DELEFE 语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值设置为NULL)。
数据库操作-DQL
-
DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。
-
关键字:SELECT
基本查询
条件查询(where)
分组查询(group by)
聚合函数:
- 介绍:将一列数据作为一个整体,进行纵向计算。
- 语法:select 聚合函数(字段列表) from 表名;
注意事项:
1、null值不参与所有聚合函数运算。
2、统计数量可以使用:count(*),count(字段),count(常量),推荐使用count(*)。
-
where 与 having 区别
1、执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
2、判断条件不同:where不能对聚合函数进行判断,而having可以。
注意事项:
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
- 执行顺序:where > 聚合函数 > having。
排序查询(order by)
排序方式只有两种:
注意事项:
- 如果是多字段排序,当第一个字段值相同是,才会根据第二个字段进行排序。
分页查询(limit)
注意事项:
1、起始索引从0开始,起始索引 = (页码 - 1)* 每页展示记录数(查询记录数)。
2、分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
3、如果查询的是第一页数据,起始索引可以省略,直接写 limit 10。
函数
- if(表达式,tvalue,fvalue):当表达式为true时,取值tvalue;当表达式为false时,取值fvalue。
- case 表达式 when value1 then result1 [when value2 then result2] [else reslut] end
多表设计
外键约束
物理外键
- 概念:使用 foreign key 定义外键关联另外一张表。
- 缺点:
- 影响增、删、改的效率(需要检查外键关系)。
- 仅用于单节点数据库,不适用与分布式、集群场景。
- 容易引发数据库的死锁问题,消耗性能。
逻辑外键
- 概念:在业务层逻辑中,解决外键关联。
- 通过逻辑外键,就可以很方便的解决上述问题。
多对多
多表查询
-
连接查询
- 内连接:相当于查询A、B交集部分
- 外连接
- 左外连接:查询左表所有的数据(包括两张表交集部分数据)。
- 右外连接:查询右表所有的数据(包括两张表交集部分数据)。
-
子查询
连接查询-内连接
连接查询-外连接
left:表1的数据会完全显示。
right:表2的数据会完全显示。
子查询
标量子查询
标量子查询:子查询返回的结果为 单个值。
列子查询
列子查询:子查询返回的结果为 一列(可以是多行)。
行子查询
行子查询:子查询返回的结果为 一行(可以是多列)。
表子查询
表子查询:子查询返回的结果为 多行多列。
将子查询语句当成一张临时表来使用。
事务
四大特性:
- 原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败。
- 一致性:事务完成时,必须使所有的数据都保持一致状态。
- 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性:事务一旦提交或回滚,它对数据库中的数据的改变是永久的。
数据库优化-索引
概念:索引(index)是帮助数据库 高效获取数据 的 数据结构。
优点:
- 提高数据查询的效率,降低数据库的IO成本。
- 通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗。
缺点:
- 索引会占用存储空间。
- 索引大大提高了查询效率,同时却也降低了insert、update、delete的效率。
索引-结构
MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是默认的 B+Tree 结构组织的索引。
- B+Tree(多路平衡搜索树)
B+Tree特点:
- 每一个节点,可以存储多个key(有n个key,就有n个指针)。
- 所有的数据都存储在叶子节点,非叶子节点仅用于索引数据。
- 叶子节点形成了一颗双向链表,便于数据的排序及区间范围查询。
注意事项:
- 主键字段,在建表时,会自动创建主键索引(主键索引是所有索引中性能最高的)。
- 添加唯一约束时,数据库实际上会添加唯一索引。
Mybatis
- MyBatis是一款优秀的持久层框架,用于简化 JDBC 的开发。
数据库连接池
- 数据库连接池是以个容器,负责分配、管理数据库连接(Connection)。
- 它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
- 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏。
优势:
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
标准接口
- Druid(德鲁伊)
- Druid连接池是阿里巴巴开源的数据库连接池项目。
- 功能强大,性能优秀,是Java语言最好的数据库连接池之一。
如何切换到 Druid 连接池
在Maven依赖中加入:
lombok
lombok 是一个实用的 Java 类库,能通过注解的形式自动生成构造器、gettet / setter、equals、hashcode、toString 等方法,并可以自动化生成日志变量,简化 Java开发、提高效率。
使用前需要先引入 lombok 依赖
注意事项:
- lombok 会在编译时,自动生成对应的 Java 代码。我们使用 lombok 时,还需要安装一个 lombok 的插件(idea自带)。
Mybatis日志输出
提示:只需要输入关键字 mybatis.log 后选择 StdOutImpl。
预编译
优势:
- 性能更高
- 更安全(防止SQL注入)
SQL注入
- SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。
基础操作
参数占位符
有两种:#{...} 和 ${...}
增
接口方法:
参数多的情况下可以通过实体类的封装起来
新增(主键返回)
- 描述:在数据添加成功后,需要获取擦汗如数据库的主键。
删
接口方法:
‘ ?’ 最终会代替 #{...}
注意事项:
如果 mapper 接口方法形参只有一个普通类型的参数,#{...} 里面的属性名可以随便写,如:#{id}、#{value}(最好与形参名保持一致)。
改(更新)
查
id查询
条件查询
解决方法:
将 '%${name}%' 转换成 concat ('%',#{name},'%')
数据封装
- 实体类属性名 和 数据库表查询返回的字段名一致,mybatis会自动封装。
- 如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装。
解决方法:
方案一:
方案二:
方案三;
在 application.properties 中
XML映射文件
规范:
- XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
- XML映射文件的 namespace 属性为Mapper接口全限定名一致。
- XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
动态SQL
随着用户的输入或外部条件的变化而变化的SQL语句,称为 动态SQL。
<if>
- <if>:用于判断条件是否成立。使用 test 属性进行条件判断,如果条件为true,则拼接SQL。
- <where>:where 元素只会在子元素有内容的情况下才插入where子句。 而且会自动去除子句的开头的and 或 or。
- <set>:动态地在行首插入set 关键字,并会删除额外的逗号。(用在update语句中)
<foreach>
foreach 主要用在批量操作当中
<sql> <include>
- <sql>:定义可重复的 SQL 片段。
- <include>:通过属性 refid,指定包含的 sql 片段。
增加代码的复用性,便于后期修改。