HTTP协议
概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器与服务器之间数据传输的规则。
特点:
1.基于TCP协议:面向连接,安全
2.基于请求-响应模型:一次请求对应一次响应
3.HTTP协议是无状态的协议:对于事务处理没有记忆能力,每次请求-响应都是独立的。
优点:速度快 缺点:多次请求间不能共享数据
请求协议
请求数据格式
请求方式--get:请求参数在请求行中,没有请求体。get请求大小在浏览器中是有限制的
请求方式--post:请求参数在请求体中,post请求大小是没有限制的。
请求行:请求数据第一行(请求方式、资源路径、协议)
请求头:第二行开始,格式key-value
请求体:post请求,存放请求参数
请求数据获取
http请求数据不需要程序员自己解析,web服务器负责对http请求数据进行解析,并封装为了请求对象。
如何获取请求数据?
httpservletrequest对象里面封装了所有的请求信息。
响应数据格式
响应行:响应数据第一行(协议、状态码、描述)
响应头:第二行开始,格式key:value
响应体:最后一部分,存放响应数据
耦合:衡量软件中各个层/各个模块的依赖关联程度
内聚:软件中各个功能模块内部的功能联系
高内聚低耦合
控制反转:IOC(Inversion Of Control),对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转
依赖注入:DI(Dependency Injection)。容器为应用程序提供运行时,所依赖的资源称之为依赖注入
Bean对象:ioc容器中创建、管理的对象称之为Bean
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:
@Component:声明bean的基础注解
@Controller:@Component的衍生注解,标注在控制层类上
@Service:@Component的衍生注解,标注在业务层类上
@Repository:@Component的衍生注解,标注在数据访问层类上(由于与mybatis整合,用的少)
在springboot集成web开发中,声明控制器bean只能用@Controller。声明bean的注解想要生效,需要被扫描到,启动类默认扫描当前包及其子包。
基于@Autowired进行依赖注入的常见方式有三种:
1.属性注入(多) 优点:代码简洁、方便快速开发 缺点:隐藏了类之间的依赖关系、可能会破坏类的封装性
@RestController
public class UserController{
@Autowired
private UserService userService;
...
}
2.构造函数注入 优点:能清晰地看到类的依赖关系、提高了代码安全性 缺点:代码繁琐、若构造参数过多会导致构造函数臃肿
java
public class UserController{
private final UserService userService;
@Autowired
public UserController(UserService userService){
this.userService=userService;}
...
}
3..setter注入 优点:保持了类的封装性、依赖关系更清晰 缺点:需要额外编写setter方法,增加了代码量
java
@RestController
public class UserController{
private final UserService userService;
@Autowired
public void UserService(UserService userService){
this.userService=userService;}
...
}
@Autowired注解,默认是按照类型进行注入。
如果存在多个相同类型的bean,会报错。
解决方法:1.@Primary 2.@Qualifier 3.@Resource
@Resource和@Autowired区别:@Autowired是spring框架提供的注解,而@Resource是javaee规范提供的;@Autowired默认是按照类型注入,而@Resource默认是按照名称注入
JDBC(Java DatBase Connectivity):使用java语言操作关系型数据库的一套API。
MyBatis是一款优秀的持久层框架,由于简化JDBC的开发
数据库连接池是个容器,负责分配、管理数据库连接。它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。释放空闲时间超过最大时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏。优势:资源重用、提升系统响应速度、避免数据库连接遗漏。标准接口:DataSource,功能获取连接。(Druid、Hikari默认)
|-----|-------------------------------|---------------|---------|
| 符号 | 说明 | 场景 | 优缺点 |
| #{} | 占位符。执行时,会将#{...}替换为?,生成预编译sql | 参数值传递 | 安全、性能高 |
| ${} | 拼接符。直接将参数拼接在sql语句中,存在sql注入问题。 | 表名、字段名动态设置时使用 | 不安全、性能低 |
在mybatis中既可以通过注解配置sql语句也可以通过xml配置文件配置sql语句。
默认规则:
1.xml映射文件的名称与mapper接口名称一致,并且将xml映射文件和mapper接口放置在相同包下。
2.xml映射文件的namespace属性为mapper接口全限定名一致
3.xml映射文件中sql语句的id与mapper接口中的方法名一致,并且保持返回类型一致
yml配置文件
格式:数值前边必须有空格,作为分隔符;使用缩进表示层级关系,缩进时不允许使用tab键,只能用空格;缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;#表示注释
Restful
Rest(REpresentational State Transfer),表述性状态转换,它是一种软件架构风格。
Rest风格特点:URL定义资源、HTTP动词描述操作
项目解析


代码执行顺序是:
浏览器/前端
↓
DeptController
↓
DeptService
↓
DeptServiceImpl
↓
DeptMapper
↓
数据库 dept 表
↓
返回部门列表
↓
Result.success(...)
↓
返回给前端
1. Controller:接收请求
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@GetMapping("/depts") //->当前端发送 GET 请求访问 /depts 时,就会执行下面的 findAll() 方法。
public Result findAll() {
List<Dept> deptList = deptService.findAll(); //->Controller 自己不去查数据库,而是调用 Service,让 Service 去处理查询部门这件事。
return Result.success(deptList); //->把查出来的部门列表包装成统一格式,然后返回给前端。
}
}
作用是:接收前端请求,并返回响应结果。
2. Service:业务处理
作用是:处理业务逻辑。
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
@Override
public List<Dept> findAll() {
return deptMapper.findAll();
}
}
3. Mapper:操作数据库
@Mapper
public interface DeptMapper {
/**
* 查询全部部门
*/
@Select("select * from dept order by update_time desc")
public List<Dept> findAll();
}
作用是:真正去数据库查询数据。
4. 三个 findAll() 是什么关系?


用户访问 /depts,Controller 接住请求,Controller 调用 Service,Service 调用 Mapper,Mapper 执行 SQL 查 dept 表,查到的数据返回给 Service,再返回给 Controller,最后 Controller 用 Result.success() 包装后返回给前端。