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用法,两个参数左闭右开,一个参数直接到末尾

posted @ 2025-03-10 12:42  huhulahu  阅读(11)  评论(0)    收藏  举报