SpringBoot项目常用注解的积累与代码的优化实践

文摘   教育   2023-12-20 22:51   广东  


欢迎访问作者的个人网站
www.yxclass.net


第一章

SpringBoot项目初始化


1.1、分模块设计思想


在创建项目时,为了方便项目的管理维护,升级扩展,以及团队协助、资源共享,一般会采用分模块设计的思想进行开发。


分模块设计就是将项目按照功能/结构拆分成若干个子模块,方便项目的管理维护、拓展,也方便模块键的相互调用、资源共享。


分模块设计之后,如果我们当前模块需要用到另外一个模块的功能,我们直接引入依赖模块坐标就可以了。


1.2、创建Maven工程


Maven和Java一样支持多重继承,依赖具有传递性,因此我们首先要创建一个空的Maven项目,让他继承SpringBoot父工程,并且把子工程都会用到的依赖在父工程中引入统一管理。





<properties>统一定义依赖版本属性。




<dependencyManagement>统一对依赖包进行管理。






<dependencyManagement>与<dependencies>的区别:

答:
<dependencyManagement>用于集中管理项目中的所有依赖关系,他不会直接依赖,所以他通常位于项目的父pom.xml中。如果在父pom.xml的<dependencyManagement>统一定义了依赖项的版本信息,那么某个子工程中要用到这些依赖项的话,直接引入groupId和artifactId即可,无需指定version版本号。



<dependencies>是直接依赖,在父工程配置了依赖,所有的子工程都会直接继承下来。 


1.3、创建启动类


创建好父工程后,在父工程下面创建多个Maven子工程,并在需要启动的项目中创建启动类。


在启动类上打上@SpringBootApplication就证明当前项目是一个SpringBoot项目,就可以实现自动配置了。



启动类上常用的注解有以下几个:


1.3.1、@SpringBootApplication


这是SpringBoot应用的自动化配置和启动注解。


1.3.2、@EnableScheduling


@EnableScheduling是SpringTask轻量级任务调度框架的一个注解。他是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。

作用:定时自动执行某段Java代码,常用于取消超时订单,定时生成统计文件等业务场景。




使用步骤:


步骤1:启动类上加上@EnableScheduling注解后,就可以在代码中使用定时任务的这个功能。


步骤2:新建一个定时任务类,类上打上@Compoent注解,将这个类交给IOC容器管理。


步骤3:在定时任务类的方法上打上@Scheduled注解,这个注解有两个属性,分别是cron表达式和fixedDelay表达式。




cron表达式表达的是什么时候执行这个任务,这个表达式有七位,分别是年月周日时分秒。


cron表达式在线生成器:

https://cron.qqe2.com/





fixedDelay每隔多长时间执行一次,单位是毫秒。



1.3.3、@MapperScan


@MapperScan("net.yxclass.course.mapper")  

这个注解告诉SpringBoot在启动时扫描指定包下的Mapper接口并自动配置它们。  


1.3.3、@EnableAspectJAutoProxy


使用@EnableAspectJAutoProxy注解,开启AspectJ的自动代理功能。


AspectJ是一个面向切面的编程框架,可以在运行时对Java类进行修改,实现一些如日志、事务管理等通用功能。


这里设置proxyTargetClass = true表示使用CGLIB来代理目标类(如果目标类没有接口,那么AspectJ会使用CGLIB来创建一个子类来代理目标类),设置exposeProxy = true表示允许在代理对象上调用getProxy()方法来获取代理对象。  

  

1.3.4、@Slf4j


SLF4J(Simple Logging Facade for Java)是一个为Java日志功能提供简单统一接口的库。

它屏蔽了各种不同的底层日志实现细节,让开发人员只需要使用它提供的API即可使用各种不同的底层日志实现来记录日志。


第二章

HTTP协议


欢迎访问作者的个人网站
www.yxclass.net


2.1、HTTP协议的特点


HTTP:Hyper Text Transfer Protocol(超文本传输协议),规定了浏览器与服务器之间数据传输的规则。


协议就是一种约定,规定好一种信息的格式,如果发送方按照某种请求格式发送信息,那么接收端就要按照这样的格式解析数据,这就是协议。总的说来就是我们约定好的一种规范,我按照这种协议发送给你,你就要用这种协议进行解析,不然就会失败


常见的协议有json协议和xml协议


json协议



xml协议



2.2、HTTP协议的底层


HTTP底层是基于TCP协议实现的,TCP是一种面向连接的传输层通信协议。在建立连接之前,需要通过三次握手来确保连接的建立。断开连接时,需要进行四次挥手来确保连接的正确断开。


TCP是一种面向连接的传输层通信协议,是可靠的传输协议,因为它提供了错误检测和纠正机制,确保数据的完整性和准确性。此外,TCP是基于字节流的,这意味着它可以逐个字节地传输数据,使得数据传输更加安全和可靠。

TCP协议发送的数据包没有大小限制。


UDP协议是无连接,是不可靠的通信协议,因为UDP协议在传输数据时不管对方是否在线,数据在传输过程中丢失也不管,接收方有没有接收到数据都不需要返回确认。

UDP协议发送的一个数据包限制在64k以内。




OSI网络参考模型:


OSI(Open System Interconnection)网络参考模型是国际标准化组织在1985年研究网络互连模型时提出的概念模型。该模型将网络从逻辑上分为了七层,由下到上分别是物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。每一层都有相关、相对应的物理设备,比如路由器、交换机。



IP协议对应是网络层,打开浏览器,输入IP,发送一个请求,首先是本地解析,然后通过电信网络传输到对方的电脑,对方的路由网卡就会进行相应的解析,打开对应的应用就是应用层了。
UDP和TCP是传输层协议。
HTTP是应用层协议。


2.3、HTTP是无状态协议


HTTP是基于请求响应模型:请求和响应是一一对应关系,没有请求,就没有响应,一次请求对应一次响应(先请求后响应)。

HTTP协议是无状态协议:对于数据没有记忆能力每次请求响应都是独立的。无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。

HTTP协议的优点:它是一种短工协议,因此传输速度非常快。

HTTP协议的缺点:多次请求间不能共享数据,但是可以通过Session或者token令牌的会话技术来解决这个缺点。

2.4、HTTP的九种请求方法


  1. Get:向服务器获取资源,比如常见的查询请求。

  2. Post:向服务器提交数据而发送的请求。

  3. Head:和get类似,返回的响应中没有具体的内容,用于获取响应报文的头部信息。

  4. Put:一般是用于更新请求,比如更新个人信息、商品信息全量更新。

  5. Patch:Put 方法的补充,更新指定资源的部分数据。

  6. Delete:用于删除指定的资源。

  7. Options: 获取服务器支持的HTTP请求方法,服务器性能、跨域检查等。

  8. Connect: 方法的作用就是把服务器作为跳板,让服务器代替用户去访问其它网页,之后把数据源返回给用户,网页开发基本不用这个方法,如果是http代理就会使用这个,让服务器代理用户去访问其他网页,类似Nginx等反向代理中介。

  9. Trace:回显服务器收到的请求,主要用于测试或诊断。




在网站开发中,我们一般就用到get请求获取数据;
post请求提交数据;
put请求更新数据;
delete请求删除数据。




get请求和post请求的区别简单说一下:


1、get请求一般是获取数据,post请求一般是提交数据。
2、post请求比get请求安全。
因为get请求在地址栏后面以 ? 的方式传参,多个参数之间用&分隔(地址和数据直接暴露在url上面了,不安全)。而post请求是在body以表单的方式传参,相对来说更安全一些。


2.5、HTTP请求消息结构


网络编程的三要素:IP(设备在网络中的唯一标识),端口(应用在设备中唯一的标识,范围是:0~65535),协议(连接和数据在网络中传输的规则,常见的协议有TCP/IP,HTTP,HTTPS和DHCP等)。


发送一次请求的流程:首先通过ip地址找到对方电脑,然后通过端口号找到对方电脑上的应用程序,最后就是按照双方约定好的规则发送、接收数据


http协议请求消息体分为三部分:请求行,请求头,请求体。


1、请求行
协议名。
URL地址。
请求方法。

2、请求头
报文头包含若干个属性 格式为“属性名:属性值”。
服务端据此获取客户端的基本信息。

3、请求体
请求的参数,可以是json对象、xml对象,也可以是前端表单生成的key=value&key=value的字符串。


2.6、HTTP响应消息结构


1、响应行
报文协议及版本、状态码 。

2、响应头
响应报文头包含若干个属性,格式为“属性名:属性值” 。

3、响应正文
响应报文体,是网页上展示的内容,有多种形式,比如html、xml、json、图片、视频文件等。


2.7、HTTP响应消息结构


1XX: 收到请求,需要请求者继续执行操作,比较少用。

2XX: 请求成功,常用的是200。

3XX: 重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取,重定向的好处有:网站改版、域名迁移等,多个域名指向同个主站导流。
301:永久性跳转,比如域名过期,换个域名。
302:临时性跳转。

4XX: 客户端出错,请求包含语法错误或者无法完成请求。
400: 请求出错,比如语法协议或者参数格式不对等等。
403: 没权限访问。
404: 找不到这个路径对应的接口或者文件。
405: 不允许此方法进行提交,Method not allowed,比如后端接口一定要POST方式,而你是用了GET。

5XX: 服务端出错,服务器在处理请求的过程中发生了错误。
500: 服务器内部报错了,完成不了这次请求。
503: 服务器宕机。


第三章

Controller控制器层常用注解


欢迎访问作者的个人网站
www.yxclass.net


3.1、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响应。





3.2、Controller控制器层方法的注解


3.2.1、@GetMapping请求查询数据


@GetMapping("/historyOrders")


  • @GetMapping是Spring 4.3及以上版本中引入的一个注解,用于处理HTTP GET请求。
  • "/historyOrders"是该处理方法对应的URL路径。当客户端发送一个GET请求到/historyOrders路径时,这个处理方法会被调用。

@ApiOperation("历史订单查询"):



  • @ApiOperation是Swagger框架的注解,用于生成API文档。Swagger是一个用于构建、设计、文档化RESTful Web服务的框架。

  • "历史订单查询"是这个API操作的描述,当生成API文档时,这个描述会被显示出来,帮助开发者或其他用户理解这个API的功能。


3.2.2、@PostMapping请求提交数据



  • @PostMapping("/submit") 是Spring框架中的一个注解,用于处理HTTP POST请求。

  • @PostMapping:这是Spring 4.3及以上版本中引入的注解,用于标记一个方法,使其能够处理HTTP POST请求。

  • "/submit":这是URL路径,与该方法关联。当客户端向这个路径发送POST请求时,这个方法会被调用。


3.2.3、@PutMapping请求更新数据



  • @PutMapping("/payment") 是Spring框架中的一个注解,用于处理HTTP PUT请求。

  • @PutMapping:这是Spring 4.3及以上版本中引入的注解,用于标记一个方法,使其能够处理HTTP PUT请求。

  • /payment:这是URL路径,与该方法关联。当客户端向这个路径发送PUT请求时,这个方法会被调用。


3.2.4、@DeleteMapping删除数据



@DeleteMapping是Spring框架中的一个注解,用于处理HTTP DELETE请求。
当客户端向"/admin/category"这个路径发送DELETE请求时,这个方法会被调用。



3.3、接收参数常用的注解


3.3.1、@RequstParam接收简单表单参数




前端代码:




后端接口:



3.3.2、HttpServletRequest


前端传过来的参数也可以通过HttpServletRequest的API进行接收。


HttpServletRequest是Java Servlet API的一部分,用于处理HTTP请求。以下是一些HttpServletRequest常用的方法:


  1. getRequestURI():获取请求的资源路径。

  2. getRequestURL():获取请求的统一资源定位符(绝对路径)。

  3. getRemoteHost():获取客户端的IP地址。

  4. getHeader():获取请求头。

  5. getParameter():获取请求的参数。

  6. getParameterValues():获取请求的参数(多个值的时候使用)。

  7. getMethod():获取请求的方式(GET或POST)。

  8. setAttribute(key, value):设置域数据。

  9. getAttribute(key):获取域数据。


这些方法可以用于处理HTTP请求,提取请求的信息,并可以用于构建动态的Web应用程序。



3.3.3、使用对象接收前端参数


前端传过来的参数,可以在方法上定义形参变量来接收,但如果变量多的话,还是应该使用对象进行接收,对象的属性必须与前端传过来的参数名一样。


前端代码:





后端代码:




3.3.4、使用集合接收前端参数


使用用集合接收前端参数,要打上@RequstParam注解。



3.3.5、@DateTimeFormat接收日期参数


对日期类型的参数在进行封装的时候,需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。前端传过来的日期格式必须和pattern的格式一样。






如果后端是使用对象接收日期格式的参数,则需要在对象属性上面使用@DateTimeFormat指定日期格式。



DateUtils.DEFAULT_DATE_TIME_FORMAT是Spring框架中DateUtils类的一个静态常量,其默认值是"yyyy/MM/dd HH:mm:ss"。


3.3.6、@RequestBody接收JSON格式的参数


JSON是开发中最常用的前后端数据交互方式。




3.3.7、PathVariable接收路径参数


如果要传的路径参数有多个,那么占位符也要定义多个,而且每一个占位符都要在每个形参前面都要写上@PathVariable注解




如果占位符的名字和方法的形参名字一样,那么@PathVariable注解的value属性可以不用写,否则就要写上占位符value属性值。



3.4、统一响应结果


定义一个Result实体类来统一定义返回结果,在这个Result类中应该包含一下内容:

  • 响应状态码:当前请求是成功,还是失败(1是成功,0是失败)

  • 状态码信息:给页面的提示信息(查询给返回,增删改一般不返回)

  • 返回的数据:给前端响应的数据(字符串、对象、集合)




第四章

Service层常用注解


欢迎访问作者的个人网站
www.yxclass.net

4.1、SpringIOC的注解


4.2、@Transational事务管理注解


4.3、@GlobalTransational分布式事务注解

Seata解决分布式事务的四种解决方案:XA,AT,TCC,SAGA。

  1. XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入。
  2. AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式。
  3. TCC模式:最终一致的分阶段事务模式,有业务侵入。
  4. SAGA模式:长事务模式,有业务侵入。



分布式事务AT模式的实现:

步骤1:导入Seat官方提供数据库表,记录全局锁。

步骤2:在配置文件中设置Seata分布式事务的模式,每个参与到分布式事务的服务都要设置。


步骤3:在分布式事务入口层加上@GlobalTransational注解,开启全局事务。


4.4、@Async异步执行注解

@Async:这是Spring框架提供的注解,用于声明一个方法是异步执行的。当一个方法被@Async注解后,Spring会为其创建一个新的线程来执行该方法,从而实现异步处理。







Spring框架提供了五种线程池:

  1. SimpleAsyncTaskExecutor:这个类不是真正的线程池,每次调用都会创建一个新的线程。

  2. SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作,只适用于不需要多线程的地方。

  3. ConcurrentTaskExecutor:这是Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类。

  4. SimpleThreadPoolTaskExecutor:这是Quartz的SimpleThreadPool的类。线程池同时被quartz和非quartz使用,才需要使用此类。

  5. ThreadPoolTaskExecutor:这是最常使用的线程池,实质是对java.util.concurrent.ThreadPoolExecutor的包装。




阿里巴巴的Java开发手册中,在并发编程部分,强调了应该通过ThreadPoolExecutor的方式创建线程池,而不是使用Executors。这是因为ThreadPoolExecutor允许更明确地设定线程池的运行规则,规避资源耗尽的风险。


ThreadPoolExecutor线程池参数介绍:

第1个参数corePoolSize控制核心线程的数量。
第2个参数控制核心线程加上救济线程不能超过这个数量。核心线程也可以为0的。
第3个救急线程存活时间。
第4个参数是救急线程存活时间的单位。
第5个参数workQueue是阻塞工作队列是对任务起到缓冲的作用,队列的工作顺序是先进先出。
第6个参数是在线程创建时起一个好听的名字。
第7个参数handler拒绝策略,核心线程都在忙,阻塞队列放满了,救急线程也在忙,就由第7个参数对新来的线程进行处理,它有有四种拒绝策略:

  1. CallerRunsPolicy:在任务被拒绝添加后,会在调用者线程中直接执行被拒绝的任务。谁提交的就交给谁来负责。阻塞调用者的任务。

  2. DiscardPolicy:直接丢弃新来的任务,不做任何处理 。

  3. AbortPolicy:直接抛出 RejectedExecutionException 异常 。

  4. DiscardOldestPolicy:将最早被放入等待队列的任务丢弃,然后将新任务加入等待队列。





核心线程和最大线程的通用配置方式:
核心线程数通用设置:CPU核数<=核心线程数<=CPU核数*2。
最大线程池通用设置:CPU核数*2。



第五章

Mapper层常用注解


欢迎访问作者的个人网站
www.yxclass.net

5.1、@Select标记查询方法的注解



5.2、@Insert标记删除方法的注解



@Insert: 这是MyBatis的注解,表示这是一个插入操作的SQL语句。




<script>...</script>: 这是MyBatis的脚本标签,在增删改查的注解里面加上<script>...</script>就可以在里面使用<if>,<where>,<foreach>等标签了。



<foreach>: 这是MyBatis的循环标签,用于遍历集合或数组,并生成重复的SQL片段。
collection='courseCataSubjects': 表示要遍历的集合名为courseCataSubjects,这个名字就就是方法形参前@Param注解定义的名字。
item='ccs': 表示在每次迭代中,当前元素被命名为ccs。
separator=',': 表示每次迭代后,使用逗号,分隔生成的SQL片段。



#{ccs.courseId},#{ccs.cataId},#{ccs.subjectId}: 这是使用MyBatis的参数占位符。它表示从当前的ccs对象中获取courseId、cataId和subjectId属性的值。



@Param("courseCataSubjects"): 这是MyBatis的注解,用于将Java方法的参数映射到SQL语句中的参数。在这里,它告诉MyBatis,我们传入的参数列表的名字是courseCataSubjects。



5.3、@Delete标记删除方法的注解



5.4、@Update标记修改方法的注解



@Update("UPDATE coupon SET issue_num = issue_num + 1 WHERE id = #{couponId} AND issue_num < total_num")

通过乐观锁的方式解决优惠卷超领取的问题,这条sql的含义是在coupon表中,对于给定的id(通过参数couponId提供)和条件issue_num < total_num满足的记录,将其issue_num字段的值增加1。如果issue_num的值已经达到了total_num,那么这个更新不会执行,因为WHERE条件不满足。


悲观锁和乐观锁


悲观锁:认为线程安全问题一定会发生,因此在操作数据之前先获取锁,避免并发情况下的线程安全问题。例如Synchronized、Lock都属于悲观锁。悲观锁性能较低,特别是在高并发的情况下,容易称为系统的瓶颈之一。


乐观锁:认为线程安全问题不一定会发生,因此他不会通过加锁的方式保护共享资源,而是在更新数据时去判断有没有其它线程对数据做了修改。
  • 如果没有修改则认为是安全的,自己才更新数据。

  • 如果已经被其它线程修改说明发生了安全问题,此时可以重试或异常。


悲观锁和乐观锁总结

1. 悲观锁:添加同步锁,让线程串行执行

   1. 优点:简单粗暴

   2. 缺点:性能一般


2. 乐观锁:不加锁,在更新时判断是否有其它线程在修改,就加一个and条件。

   1. 优点:性能好

   2. 缺点:场景不通用

  3乐观锁适用于读多写少的业务场景,通常可以提高系统的并发性能和吞吐量。


5.5、动态sql


动态SQL是指根据不同的条件或参数构建和执行SQL语句。当列表上的条件是动态的,即条件是可以不传递、只传递其中一部分或者全部传递时,使用动态SQL可以提高开发的效率,以及代码的可读性。



5.5.1、<if>条件判断标签


用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。



5.5.2、<where>标签内条件成立才会插入where子句


<where>只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或OR。





CONCAT 是 SQL 中的一个字符串函数,它的主要作用是将两个或多个字符串连接成一个单一的字符串。




在xml文件,一些特殊字符不能直接写,需要转义后才能写。


&lt;   全称是less than,是小于的意思。
&gt;  全称是greater than,是大于的意思。


5.5.3、<select>查询标签






5..5.4、<update>修改标签




5.5.5、<foreach>循环标签


<foreach>标签常用在批量插入数据和批量删除数据的场景中。



5.5.6、<insert>插入标签




5.5.6、<delete>删除标签



5.5.7、<sql>标签和<include>标签


<sql>标签和<include>标签对重复的代码进行抽取复用。


使用<sql>标签抽取重复的代码。



使用<include> 标签在原来抽取的地方进行引用。



5.5.8、pageHelper分页查询插件


前端代码:







参数实体类:





Controller层入口方法:





Service实现类业务方法:



Mapper数据持久层方法:


5.6、Mapper的sql日志输出


Mybatis框架的日志配置。


net.yxclass.modules.system.mapper包下所有sql语句的日志都会打印到控制台上。


MybatisPlus日志输出。

‍‍‍





MyBatis Log Free插件可以将动态sql的参数也打印出来。




第六章

MybatisPlus


现在如果是新开发的项目,数据持久层一般都会使用MybatisPlus框架进行开发,因为MybatisPlus是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发提高效率而生。无侵入,损耗小是他的特点,支持主键自动生成,还提供很多CRUD的API,直接调用就可以了。

欢迎访问作者的个人网站
www.yxclass.net


6.1、MybatisPlus代码生成器



6.2、MybatisPlus实现CRUD操作


6.2.1、insert插入操作



6.2.2、主键策略


@TableName("当前实体对应数据库的表名")。


@TableId(type= IdType.主键生成策略)。



五种主键生成策略:

  1. AUTO :使用数据库id自增策略控制id生成。
  2. NONE :不设置id生成策略。
  3. INPUT :用户手工输入id,根据业务规则程序事先生成赋值。
  4. ASSIGN_ID :雪花算法生成id(可兼容数值与字符串类型)。
  5. ASSIGN_UUID :以UUID生成算法作为id生成策略。


6.2.3、deleteById根据主键删除记录



6.2.3、deleteBatchIds根据批量删除记录



6.2.4、物理删除和逻辑删除


物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。
逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。



逻辑删除实现步骤:

步骤1:在数据库对应表中添加isDelete字段。

ALTER TABLE `user` ADD COLUMN `isDeleted` boolean;


步骤2:在实体类上添加isDeleted字段,并且打上@TableLogic注解。



6.2.5、updateById根据主键修改记录



6.2.6、selectById根据主键查询记录



6.2.7、selectList查询所有的记录



6.2.8、selectPage分页查询


分页查询可以使用MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能。


在配置类中设置了MybatisPlus分页拦截器就可以使用分页查询这个功能。


把分页数据取出来,封装到一个map集合中返回给前端。



6.3、条件构造器



Wrapper条件构造器主要有四个实现类,分别是:
QueryWrapper :用于查询条件封装。
UpdateWrapper :用于增删改操作。
LambdaQueryWrapper :增加Lambda链式编程。
LambdaUpdateWrapper :增加Lambda链式编程。




常用的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语句控制参数条件追加:



参数非空判断控制条件参数追加:





链式编程:



最终sql :select * from user where age > 10;


第七章

Lombok注解库


欢迎访问作者的个人网站
www.yxclass.net


使用Lombok注解需要引入Lombok依赖。

@Getter/@Setter
为所有的属性提供get/set方法

@ToString
会给类自动生成易阅读的 tostring 方法

@EqualsAndHashCode 
根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法

@Data
提供了更综合的生成代码功能 (@Getter + @Setter + @ToString + @EqualsAndHashCode

@NoArgsConstructor
为实体类生成无参的构造器方法

@AllArgsConstructor
为实体类生成除了static修饰的字段之外带有各参数的构造器方法。


第八章

统一异常处理


欢迎访问作者的个人网站
www.yxclass.net


8.1、自定义异常






8.2、统一异常处理


@RestControllerAdvice


用于全局处理 RESTful 控制器中的异常,使用统一异常处理,业务层的代码全部往外抛就可以了。



@ExceptionHandler(异常类型)这个注解用于@RestControllerAdvice修饰类的方法上,用于处理特定类型的异常。当你定义一个方法,并在这个方法上添加 @ExceptionHandler 注解时,这个方法会处理该方法所在类中所有相同类型的异常。


应用程序一般都会使用@ExceptionHandler(Exception.class)进行兜底处理未知异常,这样就可以避免异常信息直接展示到前端页面上。




第九章

SpringBoot项目常见面试题


欢迎访问作者的个人网站
www.yxclass.net


9.1、Spring和SpringBoot有什么区别


Spring和SpringBoot的主要区别体现在以下几个方面:

目的:Spring的主要目的是为开发者提供一种快速、方便的构建Java应用程序的方式。而SpringBoot则更进一步,它旨在为开发者提供一种快速、方便的构建Spring应用程序的方式。

自动配置:SpringBoot提供了大量的自动配置功能,可以大大简化应用程序的配置工作。而Spring则需要进行更多的手动配置。

快速入门:SpringBoot提供了很多预配置的模块和插件,可以快速入门开发。而Spring则需要开发者自己配置和选择需要的模块和插件。

约定优于配置:SpringBoot遵循约定优于配置的原则,可以减少大量的配置工作。而Spring则需要更多的配置工作。

依赖注入:Spring是一个基于依赖注入的框架,它通过XML或注解的方式实现依赖注入。而SpringBoot则简化了依赖注入的配置工作,提供了更多的自动配置功能。

第三方库集成:SpringBoot集成了大量的第三方库,可以方便地与各种第三方库进行集成。而Spring则需要开发者自己集成第三方库。


9.2、SpringBoot自动配置的原理


自动配置,简单来说就是自动把第三方组件的 Bean 装载到 Spring IOC 器里面,不需要开发人员再去写 Bean 的装配配置,让开发人员更加聚焦在业务代码的编写上,而不需要去关心和业务无关的配置 ,在Spring Boot 应用里面,只需要在启动类加上@SpringBootApplication 注解就可以实现自动配置。 



SpringBoot的自动配置原理主要基于以下核心组件和关键技术:

@SpringootApplication:

这是一个复合注解,它集成了
@SpringBootConfiguration,
@ComponentScan,
@EnableAutoConfiguration三个核心注解。

@SpringBootConfiguration:声明当前类是一个配置类,它告诉Spring去查找并加载这个配置类。

@ComponentScan:默认扫描启动类所在的包及其子包,查找其中的Bean定义,并注册到Spring的上下文中。

@EnableAutoConfiguration:这是实现自动装配的关键注解。它告诉Spring根据已定义的Bean和已添加的starter依赖,自动配置Bean。

自动配置的实现主要依赖于以下技术:

Starter组件:Starter组件中包含@Configuration配置类,这个配置类中定义了@Bean方法,并且这些方法上可能使用了@Conditional注解。当满足条件时,Spring会自动调用这些@Bean方法,并将方法的返回值注册到Spring的上下文中。

META-INF/spring.factories文件:这是一个元数据文件,用于存储第三方jar包中的配置类的全路径。SpringBoot通过读取这个文件,可以知道第三方jar包中的配置类的位置,这个步骤主要是用到了 Spring 里面的 SpringFactoriesLoader 来完成的。

ImportSelector接口:Spring通过实现这个接口,实现对第三方jar包中配置类的动态加载。

综上所述,SpringBoot的自动配置机制是通过读取元数据文件、动态加载配置类、根据条件自动调用@Bean方法并注册Bean等一系列步骤实现的。这种机制大大简化了应用程序的配置工作,提高了开发效率。

9.3、说一说Mybatis里面的缓存机制


MyBatis 提供了两级缓存机制,一级缓存和二级缓存。

一级缓存:MyBatis 的一级缓存是基于 SQL 会话的,也就是说它是在一个 SqlSession 中维护的。当你在 SqlSession 中执行查询操作后,MyBatis 会将查询结果缓存到一级缓存中,如果再次执行相同的查询操作,MyBatis 就会直接从缓存中获取结果,而不需要再次执行 SQL 查询。一级缓存的生命周期与 SqlSession 的生命周期相同,当 SqlSession 被关闭或清空时,一级缓存就会被清空。

二级缓存:MyBatis 的二级缓存是基于namespace的,也就是说它是在多个 SqlSession 中共享的。当你在一个 SqlSession 中执行查询操作后,MyBatis 会将查询结果缓存到二级缓存中,如果其他 SqlSession 也执行相同的查询操作,MyBatis 就会直接从二级缓存中获取结果,而不需要再次执行 SQL 查询。二级缓存的生命周期与namespace的生命周期相同,当namespace被重新加载时,二级缓存就会被清空。

需要注意的是,MyBatis 的二级缓存只适用于 select 操作,而不适用于 insert、update 和 delete 操作。此外,MyBatis 的二级缓存可以通过在 mapper.xml 文件中设置 <cache> 标签来配置。

第十章

作者介绍


吴灿锦,泰伯一百零一世孙,明朝开国名将安陆侯吴复的后代毕业于吉林财经大学

曾作为《以“计”之长——大学生计算机专业人才“培训+就业”一体化先行者》项目主持人,带领鹰迅公司创业团队参加第九届中国国际“互联网+”创新创业大赛,荣获吉林省赛区金奖

曾作为《鹰迅公司——“互联网+办公技能培训”一体化服务平台》项目主持人,带领鹰迅公司创业团队参加第十三届“挑战杯”中国大学生创业计划大赛,在吉林省赛区中荣获特等奖,在全国总决赛中荣获铜奖

曾作为《鹰迅公司——“互联网+办公技能培训”一体化服务平台》项目主持人,带领鹰迅公司创业团队参加大学生创业实践,在2022年荣获吉林财经大学创业实践国家级立项第一名(已结项)。



欢迎访问作者的个人网站
www.yxclass.net


往期精彩

“互联网+”金奖与“挑战杯”特等奖——青春的舞台,美好的回忆
Spring Framework——掌握核心注解,优化你的应用程序
工作中常用的Linux命令——以阿里云ECS服务器为例
Mysql数据库系统学习笔记
Postman接口测试项目实战
Jmeter非GUI压测项目实战笔记
Oracle数据库和PLSQL可视化工具学习笔记


远方的音讯
梧桐长成凤凰至,人伴贤良品行高!
 最新文章