第一章
SpringBoot项目初始化
在创建项目时,为了方便项目的管理维护,升级扩展,以及团队协助、资源共享,一般会采用分模块设计的思想进行开发。
分模块设计就是将项目按照功能/结构拆分成若干个子模块,方便项目的管理维护、拓展,也方便模块键的相互调用、资源共享。
分模块设计之后,如果我们当前模块需要用到另外一个模块的功能,我们直接引入依赖模块坐标就可以了。
Maven和Java一样支持多重继承,依赖具有传递性,因此我们首先要创建一个空的Maven项目,让他继承SpringBoot父工程,并且把子工程都会用到的依赖在父工程中引入统一管理。
<dependencyManagement>统一对依赖包进行管理。
创建好父工程后,在父工程下面创建多个Maven子工程,并在需要启动的项目中创建启动类。
在启动类上打上@SpringBootApplication就证明当前项目是一个SpringBoot项目,就可以实现自动配置了。
启动类上常用的注解有以下几个:
这是SpringBoot应用的自动化配置和启动注解。
使用步骤:
步骤1:启动类上加上@EnableScheduling注解后,就可以在代码中使用定时任务的这个功能。
步骤2:新建一个定时任务类,类上打上@Compoent注解,将这个类交给IOC容器管理。
步骤3:在定时任务类的方法上打上@Scheduled注解,这个注解有两个属性,分别是cron表达式和fixedDelay表达式。
cron表达式表达的是什么时候执行这个任务,这个表达式有七位,分别是年月周日时分秒。
cron表达式在线生成器:
https://cron.qqe2.com/
fixedDelay每隔多长时间执行一次,单位是毫秒。
@MapperScan("net.yxclass.course.mapper")
这个注解告诉SpringBoot在启动时扫描指定包下的Mapper接口并自动配置它们。
使用@EnableAspectJAutoProxy注解,开启AspectJ的自动代理功能。
AspectJ是一个面向切面的编程框架,可以在运行时对Java类进行修改,实现一些如日志、事务管理等通用功能。
这里设置proxyTargetClass = true表示使用CGLIB来代理目标类(如果目标类没有接口,那么AspectJ会使用CGLIB来创建一个子类来代理目标类),设置exposeProxy = true表示允许在代理对象上调用getProxy()方法来获取代理对象。
SLF4J(Simple Logging Facade for Java)是一个为Java日志功能提供简单统一接口的库。
它屏蔽了各种不同的底层日志实现细节,让开发人员只需要使用它提供的API即可使用各种不同的底层日志实现来记录日志。
第二章
HTTP协议
HTTP:Hyper Text Transfer Protocol(超文本传输协议),规定了浏览器与服务器之间数据传输的规则。
协议就是一种约定,规定好一种信息的格式,如果发送方按照某种请求格式发送信息,那么接收端就要按照这样的格式解析数据,这就是协议。总的说来就是我们约定好的一种规范,我按照这种协议发送给你,你就要用这种协议进行解析,不然就会失败 。
常见的协议有json协议和xml协议
json协议
xml协议
TCP是一种面向连接的传输层通信协议,是可靠的传输协议,因为它提供了错误检测和纠正机制,确保数据的完整性和准确性。此外,TCP是基于字节流的,这意味着它可以逐个字节地传输数据,使得数据传输更加安全和可靠。
TCP协议发送的数据包没有大小限制。
UDP协议是无连接,是不可靠的通信协议,因为UDP协议在传输数据时不管对方是否在线,数据在传输过程中丢失也不管,接收方有没有接收到数据都不需要返回确认。
UDP协议发送的一个数据包限制在64k以内。
OSI网络参考模型:
OSI(Open System Interconnection)网络参考模型是国际标准化组织在1985年研究网络互连模型时提出的概念模型。该模型将网络从逻辑上分为了七层,由下到上分别是物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。每一层都有相关、相对应的物理设备,比如路由器、交换机。
Get:向服务器获取资源,比如常见的查询请求。
Post:向服务器提交数据而发送的请求。
Head:和get类似,返回的响应中没有具体的内容,用于获取响应报文的头部信息。
Put:一般是用于更新请求,比如更新个人信息、商品信息全量更新。
Patch:Put 方法的补充,更新指定资源的部分数据。
Delete:用于删除指定的资源。
Options: 获取服务器支持的HTTP请求方法,服务器性能、跨域检查等。
Connect: 方法的作用就是把服务器作为跳板,让服务器代替用户去访问其它网页,之后把数据源返回给用户,网页开发基本不用这个方法,如果是http代理就会使用这个,让服务器代理用户去访问其他网页,类似Nginx等反向代理中介。
Trace:回显服务器收到的请求,主要用于测试或诊断。
网络编程的三要素:IP(设备在网络中的唯一标识),端口(应用在设备中唯一的标识,范围是:0~65535),协议(连接和数据在网络中传输的规则,常见的协议有TCP/IP,HTTP,HTTPS和DHCP等)。
发送一次请求的流程:首先通过ip地址找到对方电脑,然后通过端口号找到对方电脑上的应用程序,最后就是按照双方约定好的规则发送、接收数据
第三章
Controller控制器层常用注解
@Api(tags = "课程相关接口")
这是Swagger框架的注解,用于生成API文档。 tags = "课程相关接口"表示这个API或一组API是关于“课程”的。在生成的API文档中,这些API会被归类到“课程相关接口”这个标签下。
@RestController
这是Spring框架中的一个注解,用于简化编写RESTful Web服务。 @RestController=@Controller + @Response,当这两个注解结合使用时,返回的数据会被自动转换为JSON或XML格式,并作为HTTP响应返回。
@RequestMapping("courses")
这是Spring MVC中的一个注解,用于映射HTTP请求到特定的处理方法,他可以处理所有的HTTP请求。
"courses"表示所有以“courses”开头的URL请求路径都可以被当前控制器类处理。
@Slf4j
这是Lombok库中的一个注解,用于简化日志记录。 当你在类中使用这个注解时,Lombok会自动为这个类生成一个名为log的SLF4J Logger实例,你可以直接使用它来记录日志。
@Validated
这是Spring框架中的一个注解,用于参数校验。
当你在Controller的方法参数上使用这个注解时,Spring会使用该参数上标注的所有验证器进行校验。如果参数不符合任何验证规则,那么请求将被返回HTTP 400 Bad Request响应。
@GetMapping是Spring 4.3及以上版本中引入的一个注解,用于处理HTTP GET请求。 "/historyOrders"是该处理方法对应的URL路径。当客户端发送一个GET请求到/historyOrders路径时,这个处理方法会被调用。
@ApiOperation("历史订单查询"):
@ApiOperation是Swagger框架的注解,用于生成API文档。Swagger是一个用于构建、设计、文档化RESTful Web服务的框架。
"历史订单查询"是这个API操作的描述,当生成API文档时,这个描述会被显示出来,帮助开发者或其他用户理解这个API的功能。
@PostMapping("/submit") 是Spring框架中的一个注解,用于处理HTTP POST请求。
@PostMapping:这是Spring 4.3及以上版本中引入的注解,用于标记一个方法,使其能够处理HTTP POST请求。
"/submit":这是URL路径,与该方法关联。当客户端向这个路径发送POST请求时,这个方法会被调用。
@PutMapping("/payment") 是Spring框架中的一个注解,用于处理HTTP PUT请求。
@PutMapping:这是Spring 4.3及以上版本中引入的注解,用于标记一个方法,使其能够处理HTTP PUT请求。
/payment:这是URL路径,与该方法关联。当客户端向这个路径发送PUT请求时,这个方法会被调用。
后端接口:
前端传过来的参数也可以通过HttpServletRequest的API进行接收。
HttpServletRequest是Java Servlet API的一部分,用于处理HTTP请求。以下是一些HttpServletRequest常用的方法:
getRequestURI():获取请求的资源路径。
getRequestURL():获取请求的统一资源定位符(绝对路径)。
getRemoteHost():获取客户端的IP地址。
getHeader():获取请求头。
getParameter():获取请求的参数。
getParameterValues():获取请求的参数(多个值的时候使用)。
getMethod():获取请求的方式(GET或POST)。
setAttribute(key, value):设置域数据。
getAttribute(key):获取域数据。
使用用集合接收前端参数,要打上@RequstParam注解。
DateUtils.DEFAULT_DATE_TIME_FORMAT是Spring框架中DateUtils类的一个静态常量,其默认值是"yyyy/MM/dd HH:mm:ss"。
JSON是开发中最常用的前后端数据交互方式。
如果要传的路径参数有多个,那么占位符也要定义多个,而且每一个占位符都要在每个形参前面都要写上@PathVariable注解。
如果占位符的名字和方法的形参名字一样,那么@PathVariable注解的value属性可以不用写,否则就要写上占位符value属性值。
响应状态码:当前请求是成功,还是失败(1是成功,0是失败)
状态码信息:给页面的提示信息(查询给返回,增删改一般不返回)
返回的数据:给前端响应的数据(字符串、对象、集合)
第四章
Service层常用注解
XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入。 AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式。 TCC模式:最终一致的分阶段事务模式,有业务侵入。 SAGA模式:长事务模式,有业务侵入。
SimpleAsyncTaskExecutor:这个类不是真正的线程池,每次调用都会创建一个新的线程。
SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作,只适用于不需要多线程的地方。
ConcurrentTaskExecutor:这是Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类。
SimpleThreadPoolTaskExecutor:这是Quartz的SimpleThreadPool的类。线程池同时被quartz和非quartz使用,才需要使用此类。
ThreadPoolTaskExecutor:这是最常使用的线程池,实质是对java.util.concurrent.ThreadPoolExecutor的包装。
CallerRunsPolicy:在任务被拒绝添加后,会在调用者线程中直接执行被拒绝的任务。谁提交的就交给谁来负责。阻塞调用者的任务。
DiscardPolicy:直接丢弃新来的任务,不做任何处理 。
AbortPolicy:直接抛出 RejectedExecutionException 异常 。
DiscardOldestPolicy:将最早被放入等待队列的任务丢弃,然后将新任务加入等待队列。
第五章
Mapper层常用注解
悲观锁:认为线程安全问题一定会发生,因此在操作数据之前先获取锁,避免并发情况下的线程安全问题。例如Synchronized、Lock都属于悲观锁。悲观锁性能较低,特别是在高并发的情况下,容易称为系统的瓶颈之一。
如果没有修改则认为是安全的,自己才更新数据。
如果已经被其它线程修改说明发生了安全问题,此时可以重试或异常。
1. 悲观锁:添加同步锁,让线程串行执行
1. 优点:简单粗暴
2. 缺点:性能一般
2. 乐观锁:不加锁,在更新时判断是否有其它线程在修改,就加一个and条件。
1. 优点:性能好
2. 缺点:场景不通用
3乐观锁适用于读多写少的业务场景,通常可以提高系统的并发性能和吞吐量。
动态SQL是指根据不同的条件或参数构建和执行SQL语句。当列表上的条件是动态的,即条件是可以不传递、只传递其中一部分或者全部传递时,使用动态SQL可以提高开发的效率,以及代码的可读性。
用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
<where>只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或OR。
CONCAT 是 SQL 中的一个字符串函数,它的主要作用是将两个或多个字符串连接成一个单一的字符串。
在xml文件,一些特殊字符不能直接写,需要转义后才能写。
5.5.6、<delete>删除标签
5.5.7、<sql>标签和<include>标签
<sql>标签和<include>标签对重复的代码进行抽取复用。
使用<sql>标签抽取重复的代码。
5.5.8、pageHelper分页查询插件
前端代码:
参数实体类:
Controller层入口方法:
Service实现类业务方法:
net.yxclass.modules.system.mapper包下所有sql语句的日志都会打印到控制台上。
MybatisPlus日志输出。
MyBatis Log Free插件可以将动态sql的参数也打印出来。
第六章
MybatisPlus
6.1、MybatisPlus代码生成器
6.2、MybatisPlus实现CRUD操作
6.2.1、insert插入操作
6.2.2、主键策略
AUTO :使用数据库id自增策略控制id生成。 NONE :不设置id生成策略。 INPUT :用户手工输入id,根据业务规则程序事先生成赋值。 ASSIGN_ID :雪花算法生成id(可兼容数值与字符串类型)。 ASSIGN_UUID :以UUID生成算法作为id生成策略。
6.2.3、deleteById根据主键删除记录
6.2.3、deleteBatchIds根据批量删除记录
6.2.4、物理删除和逻辑删除
6.2.5、updateById根据主键修改记录
6.2.6、selectById根据主键查询记录
6.2.7、selectList查询所有的记录
6.2.8、selectPage分页查询
6.3、条件构造器
常用的API有以下几个:
6.3.1、QueryWrapper应用案例:
6.3.2、LambdaQueryWrapper
6.3.3、LambdaUpdateWrapper
6.3.4、and与or组合条件
and :同时成立的意思,条件与条件直接用 “.” 作为连接符号。
or :或者的意思,条件直接用 ".or" 作为连接符号。
6.3.5、NULL值处理(动态sql)
if语句控制参数条件追加:
参数非空判断控制条件参数追加:
链式编程:
第七章
Lombok注解库
第八章
统一异常处理
8.1、自定义异常
8.2、统一异常处理
@RestControllerAdvice
用于全局处理 RESTful 控制器中的异常,使用统一异常处理,业务层的代码全部往外抛就可以了。
第九章
SpringBoot项目常见面试题
9.1、Spring和SpringBoot有什么区别
9.2、SpringBoot自动配置的原理
9.3、说一说Mybatis里面的缓存机制
第十章
作者介绍
往期精彩