http
DispatcherServlet 是 Spring MVC 的核心组件,它充当前端控制器,负责拦截 HTTP 请求,并将其分发给合适的处理器(Controller)
封装到httpServletRequest对象中、HttpServletReponse对象中

BS架构、CS架构
请求参数的接收
简单参数
两种获取请求参数的方式:
1.原始方法:通过httpservletRequest对象手动获取
2.springboot中接收简单参数,只需要保证参数名相同
如果参数名不一致,通过@RequestParam完成映射,required参数默认是true,代表该参数必须传递
400是客户端参数
实体参数
请求参数与形参对象属性名保持一致
简单实体参数
复杂实体对象,按照对象层次对应起来就行
数组集合参数
保证变量名相同

日期参数
JSON参数
通过@RequestBody注解将json格式的请求数据封装到一个实体对象中
路径参数
通过@PathVariable注解获取到路径参数并且将其绑定到方法的形参
总结

设置响应数据
ReponseBody注解
将方法的返回值直接响应回去

统一响应结果
导入result类,改造controller

分层解耦
三层架构
controller、service、dao 单一职责原则


分层解耦
高内聚低耦合
为了解除代码之间的耦合
控制反转、依赖注入

IOC、DI的入门程序

@Component //将当前类交给ioc容器管理,成为ioc容器中的bean
@Autowired//运行时,ioc容器会提供该类型的bean对象,并赋值给该变量
IOC详解

@Component //将当前类交给ioc容器管理,成为ioc容器中的bean
声明bean的四大注解想要生效还需要被组件扫描注解@ComponentScan扫描到
该注解虽然没有显性配置,但包含在启动类的声明注解@springbootapplication中,默认扫描范围是启动类所在的包及其子包
DI详解
autowire自动装配 运行时,ioc容器会提供该类型的bean对象,并赋值给该变量

autowired与resource的区别

数据库
概述
关系型数据库
sql:是一门操作关系型数据库的编程语言
DDL、DML、DQL、DCL 定义 操作 查询 控制
DDL
分为数据库的创建查询使用删除,表结构的创建查询使用删除
show databases;
select database();
create database (if not exists) db01;
drop database (if exists) db01;
表结构操作-创建
五大约束:非空约束、唯一约束、主键约束、默认约束、外键约束

数值类型:tinyint,int,bigint,double
字符串类型:char(定长),varchar(变长字符串,最多存储n个,不足n个按照实际长度存储),
日期类型:date(年月日),datetime(年月日+时分秒)
DML
对数据库中的表的数据进行增删改操作
insert into tb_emp(username,name,gender,create_time,update_time) values ('wuji','张无忌',1,now(),now());
insert into tb_emp(id, username, password, name, gender, image, job, entrydate, create_time, update_time)
values (null,'zhiruo','123','周芷若',2,'1.jpg',1,'2010-01-01',now(),now());
update tb_emp set name = '张三',update_time = now() where id = 1;
update tb_emp set entrydate = '2010-10-01',update_time = now();
delete from tb_emp where id = 1;
delete from tb_emp ;-- delete不能删除某个字段的值,可以使用update将该字段置空
DQL
查询数据库中的数据
条件查询:distinct去重、模糊查询_%、in()、between and
分组查询:
聚合函数:count,max,min,avg,sum(null值不参与聚合函数的运算)
select 字段 from 表名 where 条件 group by 分组字段 having 分组后的过滤条件
where是分组之前过滤,having是对分组之后的结果进行过滤;where 不能对聚合函数进行判断,having可以(执行顺序:where-分组-having)
排序查询:
select 字段 from 表名 where 条件 group by 分组字段 order by 字段 排序方式,字段 排序方式
asc,desc
分页查询:select 字段 from 表名 limit 起始索引,查询记录数;
mysql两个函数:if,case
select if(gender =1,'男性员工','女性员工') as 性别,count(*) as 人数 from tb_emp group by gender;
select
(case job when 1 then '班主任' when 2 then '讲师' when 3 then '学工主管' when 4 then '教学主管' else '未分配' end) 职位,
count(*) as 人数
from tb_emp
group by job;
多表设计
一对多
外键约束
物理外键foreign key定义外键关联另一张表,不推荐,更推荐使用逻辑外键(??)
一对一
大表拆分成小表
在任意一方加入外键关联另一方的主键,并设置外键为唯一的unique
多对多
创建中间表,中间表至少包含两个外键,分别关联两方主键
多表查询
内连接,外连接:内连接(隐式,显式on)、左外连接(用的较多)、右外连接
子查询:标量子查询,列子查询(in,not in)、行子查询、表子查询
做了外卖的案例,比较简单
事务
一组事务要不同时执行成功,要不同时失败
acid 原子性、一致性、隔离性、持久性
几个隔离级别都没介绍
索引
MySQL 索引是一种帮数据库高效获得数据的数据结构
全表扫描性能低,创建索引创建了一个二叉搜索树,根据二叉树进行寻找(其实是b+树)
索引的缺点:索引占存储空间;提高了查询的效率,但是降低了insert、update、delete的效率(每次操作都需要维护索引二叉树)
索引的数据结构
b+树,矮胖树,一般3-4层
重温下树相关
语法
一旦指定了主键就会自动创建一个主键索引,唯一约束也会添加唯一索引
MyBatis
控制层-服务层-持久层(数据访问的dao层)
运行了一个入门程序
@Mapper //框架自动生成该接口的实现类对象(代理对象??),并且自动交给IOC容器进行管理
public interface UserMapper {
@Select("select id from user;")//要执行的是查询操作
//@Select 是 MyBatis 提供的注解,用于在接口方法上标明该方法需要执行的SQL语句。它的作用是将 SQL 查询语句与方法绑定
public List<User> list();//接口中没有具体的方法体,只有个方法定义
}
@SpringBootTest //springboot整合单元测试的注解
class SpringbootMybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;//依赖注入的方式获取到bean对象
@Test
public void testlistuser(){
List<User> list = userMapper.list();// 调用userMapper接口的list方法,(接口的实现类的方法)
list.stream().forEach(// Stream API 来遍历返回的 List<User>,不熟悉
user -> {
System.out.println(user);
}
);
}
}
//@SpringBootTest 是一个用于整合 Spring Boot 的单元测试注解。它告诉 Spring Boot 框架在测试运行时要启动整个 Spring 容器
//@Autowired 是 Spring 框架提供的注解,用于自动将符合要求的 Bean 注入到当前类中。
// 在这里,userMapper 是 UserMapper 接口的实例,它会通过 Spring 的依赖注入机制自动注入到测试类中。
JDBC
使用java语言操作关系型数据库的一套api
各个数据库厂商实现这套接口,提供数据库驱动jar包
我们可以使用这套接口编程,真正执行代码的是驱动jar包中的实现类
JDBC vs MyBatis
MyBatis只需要关注mapper接口与配置文件
数据库连接池
一个容器,负责连接对象的分配与管理
Hikari是springboot中默认的连接池
Druid alibaba
所有的数据库连接池产品都需要实现DataSource接口
lombok
实体类过于臃肿,lombok可以通过注解自动生成方法
@Data 为实体类生成getter,setter,toString,equals方法
@AllArgsConstructor、@NoArgsConstructor有参构造、无参构造
删除操作
预编译sql:性能更高(只需要编译一次,直接替换?),防止sql注入更加安全
与$两种占位符的区别

新增操作
主键返回:返回主键值
@Options(keyProperty = "id",useGeneratedKeys = true) //会自动将生成的主键值,赋值给emp对象的id属性
@Insert("insert into tb_emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
" values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime});")//括号里是属性名
public void insert(Emp emp);
更新操作
查询操作
在执行查询的时候,实体类属性名和数据库表查询返回的字段名不一致,不能自动封装
别名;results注解进行手动映射;打开驼峰命名自动映射
条件查询
@param 方法的形参名称并不会在字节码中保留(?),这个注解是为SQL语句中参数赋值而服务的
xml映射文件
mybatis中配置sql语句的两种方法:注解、xml映射文件

如果是简单的增删改查可以用注解映射,如果是复杂的sql语句可以使用xml来映射
动态sql
mybatis中提供了很多动态标签
if:用于判断条件是否成立,使用test进行条件判断
where:生成where子句,自动去除多余的and或or
代码块缩进:tab,shift+tab
set
for-each:用在批量操作中
sql:sql片段 的抽取
include:片段的应用
案例
用到的注解:mapper,RestController,Service,Data

Tomcat&&Nginx
开发规范-Restful
表达性状态转换,一种软件架构风格
url定位资源,http动词描述操作(get查询,post新增,put修改,delete删除)
前后端统一响应结果
实现抽象类的方法快捷键alt+enter
前后端联调,这个过程没懂,nginx与tomcat
日志技巧 @Slf4j
对controller进行优化 将方法上重复的mapping抽取到一个类上
员工管理-分页查询
实现思路
@requestparam()
分页插件PageHelper
条件分页查询-动态sql(xml映射文件)
@DateTimeFormat 指定前端传过来的日期时间类型的格式
@PathVariable 代表是个路径参数
批量删除 foreach
有个细节问题,short和Short,short类型不能接收空串
新增员工
通过@RequestBody注解将json格式的请求数据封装到一个实体对象中 几个注解好陌生
文件上传
enctype="multipart/form-data"
如果选择默认值仅提供的是文件的名称
文件上传的前端页面三要素:表单项type为file,表单提交方式为post,enptype属性编码格式multipart/form-data
@requestparam() value属性,默认属性
服务端接收文件,通过api multipartfile接收上传的文件
上传的文件是个临时文件,需要存储
本地存储 vs 云存储
全部存储在服务器的磁盘目录文件中,无法直接访问,磁盘空间限制,磁盘损坏(几乎不用了)
阿里云OSS 阿里云国内最大的云服务提供商
对象存储服务OSS
第三方服务的通用思路:准备工作-参照官方SDK编写入门程序-集成使用
修改员工
1.查询回显
2.修改员工
配置文件
参数配置到配置文件中,解决aliyunOSS配置问题的硬编码问题(Value注解)
yml配置文件
优先级yaml>yml>properties
常见配置文件:xml(臃肿),properties(层级结构不清晰),yml
基本语法、常见的两种数据格式
@ConfigurationProperties和@Value
都是用来注入外部配置的属性的
@value只能一个个注入,@Con可以批量的将外部属性配置注入到bean对象的属性值中
substring用法,两个参数左闭右开,一个参数直接到末尾

浙公网安备 33010602011771号