JDBC
一、JSON 基础语法
二、Ajax - Axios发起异步请求
Ajax
作用:
- 数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。
- 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页,如:搜索联想、用户名是否可用的校验等。
Axios
Axios对原生的Ajax进行了封装,简化书写,快速开发。
使用步骤:
简化写法
Maven
一款用于管理和构建java项目的工具。
- 依赖管理:方便的管理项目依赖的资源,避免版本冲突问题
- 统一项目结构:提供标准、统一的项目结构
- 项目构建:标准跨平台的自动化项目构建方式
仓库:
创建
groupId:定义当前Maven项目隶属的组织名称(通常是域名反写,如space.ericzht)
artifactId:定义当前Maven项目名称
version:定义当前项目版本号
生命周期
Maven的生命周期是为了对所有的Maven项目构建过程进行抽象和统一。
Maven中有3套相互独立的生命周期:
- clean:清理工作
- default:核心工作,如:编译、测试、打包、安装、部署等
- site:生成报告、发布站点等
需要了解的五个生命周期:
test为什么日志无法显示结果?
test包里的Java文件必须以Test结尾,日志没显示出来是因为类名错误,找不到test的文件
Spring
SpringBoot
快速便捷的Spring框架,基于SpringBoot可以快速构建Spring框架。
SpringBoot快速入门
新建模块
依赖中要勾选Spring Web
创建请求处理类 HelloController

运行启动类,在浏览器中进行测试
Tips:包被识别成文件夹怎么办?
右键Java目录,选择标记目录为源根
HTTP协议
概述
Hyper Text Tranfer Protocol 超文本传输协议
特点:
- 基于TCP协议:面向连接,安全
- 基于请求-响应模型:一次请求对应一次响应
- HTTP协议是无状态的协议:对事务处理没有记忆能力。每次请求-响应都是独立的。
- 缺点:多次请求之间不能共享数据
- 优点:速度快
请求数据
响应数据
状态码大类
状态码分类 | 说明 |
---|---|
1xx | 响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它 |
2xx | 成功——表示请求已经被成功接收,处理已完成 |
3xx | 重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。 |
4xx | 客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等 |
5xx | 服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等 |
常见的响应状态码
状态码 | 英文描述 | 解释 |
---|---|---|
==200== | OK |
客户端请求成功,即处理成功,这是我们最想看到的状态码 |
302 | Found |
指示所请求的资源已移动到由Location 响应头给定的 URL,浏览器会自动重新访问到这个页面 |
304 | Not Modified |
告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向 |
400 | Bad Request |
客户端请求有语法错误,不能被服务器所理解 |
403 | Forbidden |
服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源 |
==404== | Not Found |
请求资源不存在,一般是URL输入有误,或者网站资源被删除了 |
405 | Method Not Allowed |
请求方式有误,比如应该用GET请求方式的资源,用了POST |
428 | Precondition Required |
服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头 |
429 | Too Many Requests |
指示用户在给定时间内发送了太多请求(“限速”),配合 Retry-After(多长时间后可以请求)响应头一起使用 |
431 | Request Header Fields Too Large |
请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。 |
==500== | Internal Server Error |
服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧 |
503 | Service Unavailable |
服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好 |
状态码大全:https://cloud.tencent.com/developer/chapter/13553
Tomcat
概述
- 一个开源免费的轻量级Web服务器,支持Servlet/JSP少量的JavaEE规范。
- JavaEE:Java企业版,指企业级开发的技术规范总和。
- Tomcat也被称为Web容器、Servlet容器。Servlet程序需要依赖于Tomcat才能运行
- 对HTTP协议操作进行了封装,简化web程序开发。
请求
Postman
在网页调试中,只能在地址栏添加内容,这是GET类型的请求,很难对POST类型的请求进行测试。于是出现了Postman插件。
网页调试与发送网页HTTP请求的Chrome插件
常用于进行接口测试
SpringBoot接受请求的方式(简单参数)
1 |
|
1 |
|
@RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递则报错。如果这个参数是可选的,可以将required属性设置为false。
原始方式接受请求*
SpringBoot接受请求的方式(实体参数)
把所有参数封装到一个类中,获取时将参数全部放入类的对象中。
简单实体对象
复杂实体对象
注:这里要给类写toString方法,否则输出的是类的类似于地址的东西。
数组集合参数
- 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型参数即可接受参数
- 集合参数:需要使用 @RequestParam 绑定参数关系
日期参数
Json参数
路径参数
响应
这样响应回去的数据是各式各样的,前后端开发成本高、不便管理、很难维护。
—— 于是设定一个统一响应的规范 Result
Springboot静态资源存放目录
分层解耦
内聚:软件中各个功能模块内部的功能联系
耦合:衡量软件中各个层/模块之间的依赖、关联程度
软件设计原则:高内聚低耦合
三层架构
- Controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
- Service:业务逻辑层,处理具体的业务逻辑。
- Dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增删改查。
分层解耦
上图这种架构,如果ServiceA要改为ServiceB,那么不仅要修改Service层的代码,还要修改Controller层的代码,Service层和Controller层耦合度较高,不利于后续开发。
于是Spring提出了控制反转与依赖注入。
控制反转
Inversion Of Control,IOC
对象的创建控制权由程序自身转移到外部(容器)
依赖注入
Dependency Injection,DI
容器为应用程序提供运行时所依赖的资源
Bean对象
IOC容器中创建、管理的对象
步骤
只有单个bean
- 将Service层及Dao层的实现类交给IOC容器管理。 添加注解 @Component
- 为Controller及Service注入运行时依赖的对象。添加注解 @Autowired
程序在运行时会自动为他们提供所注解的对象
如果要切换Service层的内容,直接将原来的Service层的@Component注解注释掉给新的添加注释就好了。
同时有多个bean
@Autowired 默认是按照类型进行的,如果存在多个相同的bean,会报错。
解决方法:
- 在想要执行的类的注解上加上**@Primary**注解设置其为高优先级。
- @Autowired + @Qualifier(“bean的名称”)
- @Resource(name=”bean的名称”)
区别:
- @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
- @Autowired 默认是按照类型注入,而@Resource默认是按照名称注入
Bean组件扫描
前面声明bean的四大注解,要想生效,还需要被组件扫描注解**@ComponentScan**扫描
启动类声明的注解**@SpringBootApplication**中,默认扫描的范围是启动类所在包及其子包
如果在别的地方添加了组件,并且想要被扫描,就要使用 @ComponentScan(“包名”) 来显式配置,并且需要加上启动类所在的包名。
MyBatis
是一款优秀的持久层(dao层),用于简化JDBC的开发
快速入门
程序会自动将获取到的数据封装到User对象中,并装入List类型的集合
这里运用了IOC(控制反转)和依赖注入。
将对象的创建控制权由程序自身转移到外部(容器),并且由IOC容器来自动创建对象,需加上@Autowired
注解
JDBC
sun公司提供的一套操作关系型数据库的API(规范),但是操作很繁琐,因此使用MyBatis来简化开发。
数据库连接池
是一个容器,负责分配、管理数据库连接。
它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个连接,减少资源浪费。
释放空间时间超过最大空闲时间的连接,避免因为没有释放连接而引起的数据库连接遗漏。
优势:
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
标准接口:DataSource
第三方组织实现了该接口,springboot默认使用Hikari(追光者)
Druid(德鲁伊):阿里巴巴开源的数据库连接池项目,功能强大、性能优秀,是java语言最好的数据库连接池之一。
Lombok
一个实用的Java类库,能通过注解自动生成构造器、getter/setter、equals、toString等方法,并可以自动生成日志变量,简化java开发、提高效率。
需在pom文件中引入依赖:
基础操作
删除
1 | // 使用占位符来获取变量信息,如果只传一个参数,那占位符中的属性名可以随便写,可以写id、value等等 |
使用占位符编写的sql语句就是预编译的sql语句,编译时会用?
来替换掉占位符
预编译
- 性能更高
- 更安全(防止sql注入)
参数占位符
新增
主键返回
在数据添加成功后,需要获取插入数据库数据的主键。
如:添加套餐数据时,需要维护套餐菜品关系表数据
更新(修改)
查询
数据封装
方案1:给字段起别名,让别名与实体类属性一致
方案2:通过@Results,@Result注解手动映射封装
方案3:开启mybatis的驼峰命名自动映射开关
即a_column –> aColumn
在application.properties中添加:
条件查询
由于${ }是进行拼接,没有进行预编译,性能低。并且存在sql注入问题,所以更推荐使用concat进行拼接,这样仍然可以在concat中使用#{ }
springboot版本问题
XML映射文件
- XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
- XML映射文件的namespace属性与Mapper接口全限定名一致。
- XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
注:如果函数是void类型的,那么就不需要写resultType了。
注解主要完成简单的增删改查功能,如果需要复杂的SQL功能,建议使用XML来配置映射语句。
动态SQL
随着用户的输入或外部条件的变化而变化的SQL语句
<if>
用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接其中的SQL语句。
<where>
where元素只会在子元素有内容的情况下才插入其中的内容,并且会自动判断是否需要删除子句开头的and或者or
<set>
动态在行首插入set关键字,并会删掉额外的逗号。(用在update语句中)
<foreach>
<sql>
和<include>
相当于封装为一个函数,需要时使用include调用即可。实现代码的复用。
案例
开发规范
Restful
REST(REpresentational State Transfer),表述性状态转换,它是一种软件架构风格。
是一种约定,而不是规定,可以打破。
统一响应结果
开发流程
日志
定义日志对象
法一
1 | private static Logger log = LoggerFactory.getLogger(DeptController.class); |
法二
直接在controller接口上添加@Slf4j
注解,自动生成日志记录对象(lombok提供的便携方式)
tips
封装json数据
当前端提供的是json格式的数据,可以使用@RequestBody注解来将json数据封装到一个实体类中
省略相同的路径
可以将方法的注解中相同部分的路径提取到类上的@RequestMapping
注解中
分页查询
文件上传
使用MultipartFile类型的变量来接收上传的文件,变量名需要与前端中该表单项的名字相同。
上传大小限制
在SpringBoot中,默认单个文件允许最大大小为1M,如果需要上传大文件,需要在application.properties中添加配置:
本地存储
云端存储
根据云服务商提供的官方文档
将服务器信息写在配置文件中,通过注解的形式引入,便于后面的管理和维护。
如果使用@ConfiurationProperties注解的话需要将所有属性写到单独的一个类中,并交给IOC管理,需要使用的时候自动创建Bean对象,并通过这个对象的get方法获取对象中的属性。
单独的类:
依赖注入:
yml配置文件
常见配置文件格式对比
yml
大小写敏感
数值前必须有空格,作为分隔符
使用缩进表示层级关系,缩进时不可以使用tab键,只能用空格。(但是idea会自动将tab转换为空格)
缩进的空格数不重要,只要相同层级的元素左侧对齐即可
#
表示注释,从这个字符一直到行尾,都会被解析器忽略
左properties 右yml:
登录校验
会话技术
会话:用户打开浏览器,访问web服务器的资源,会话建立。直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一会话的多次请求间共享数据。
会话跟踪方案:
- 客户端会话跟踪技术:Cookie
- 服务端会话跟踪技术:Session
- 令牌技术
会话跟踪方案对比
主流方案:
JWT令牌
JSON Web Token
定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。
使用场景:
- 登陆成功后,生成令牌。
- 后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理。
生成令牌
解析、校验令牌
过滤器 Filter
可以把对资源的请求拦截下来,从而实现一些特殊的功能(登录校验、统一编码处理、敏感字符处理等)。
入门
执行流程
拦截路径
过滤器链
登录校验流程

拦截器
一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供,用来动态拦截控制器(Controller)方法的执行。
作用:拦截请求,在指定方法调用前后,根据业务执行预先设定的代码。
入门
拦截路径
执行流程
异常处理
事务管理
事务是一组操作的集合,是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败。
Spring事务管理
@Transactional 注解
写在业务(service)层的方法、类、接口上
作用:将当前方法交给Spring进行事务管理,方法执行前,开启事务。成功执行结束,则提交事务;出现异常,则回滚事务。
默认情况下,只有出现 RuntimeException 才会回滚。
事务管理日志
在yml文件中配置
rollbackFor属性——回滚
用于控制出现何种异常类型时,回滚事务。
1 | // 这样设置是所有异常都会回滚 |
propagation属性——传播行为
当一个事务被另一个事务方法调用时,这个事务方法应如何进行事务控制。
AOP
AOP基础
概述
Aspect Oriented Programming (面向方面编程),其实就是面向特定方法编程
场景:
部分功能运行较慢,如果要定位执行耗时较长的业务方法,需要统计每一个业务方法的执行耗时
实现:
动态代理是面向切面编程最主流的实现。而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。
更正,不是接口名,而是类名
核心概念
通知类型
即什么时候执行方法。
切入点表达式
用来描述切入点方法的一种表达式。
作用:决定项目中的哪些方法需要加入通知
常见形式1:execution

()
匹配没有参数的方法(..)
匹配有任意数量参数的方法(*)
匹配有一个任意类型参数的方法(*,String)
匹配有两个参数的方法,并且第一个为任意类型,第二个为String
类型
通配符描述切入点:
根据业务需要,可以使用与&&,或||,非! 来组合比较复杂的切入点表达式
注:update* 表示以update开头的方法
封装
如果几个切面的切入点表达式相同(重复——>封装)
常见形式2:@annotation
用于匹配标识有特定注解的方法
这样的话需要创建一个文件来定义注解:
1 | // 设置该注解用于代码运行时 |
上图annotation中的内容时这个注解定义文件的具体包名。
通知顺序
SpringBoot 原理
配置文件优先级
java系统属性和命令行参数配置
springboot除了支持使用配置文件来配置属性,还支持以下两种方式配置属性。
bean的获取
bean的作用域
可以通过 @Scope 注解来配置作用域