1.Springboot基础篇笔记

news2024/11/17 15:36:42

Springboot基础篇

1.快速上手Springboot

1.基础配置

1.parent

通过配置指定父工程依赖为spring-boot-starter-paerent实现了版本管理的功能,再导入springboot整合其他技术的jar包即可

  • 作用:指定jar包版本信息信息,避免依赖版本冲突

    image-20230316091224272

    这个spring-boot-dependecies才是管理所有收录jar包版本和坐标的类,这是自动配置核心

    所以创建boot工程可以这样写spring-boot-dependecies(管理坐标) + spring-boot-starter(自动配置类)

    所以在创建boot工程的时候pom.xml文件也可以这样写,不用声明parent为spring-boot-starter-parent

    image-20230701145018423

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.example</groupId>
        <artifactId>springboot_30_loadup</artifactId>
            
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
        </dependencies>
    
        <!--重点,只需要导入这个,再导入spring-boot-starter即可完成一个boot工程-->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>${spring-boot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <!--不用看-->
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring-boot.version}</version>
                    <configuration>
                        <mainClass>com.example.Springboot30LoadupApplication</mainClass>
                        <skip>true</skip>
                    </configuration>
                    <executions>
                        <execution>
                            <id>repackage</id>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    image-20230316091241573

    image-20230316091301384

2.starter

  • 总述starter好处:

    ①springboot整合其他技术后形成的一个统一的jar包,springboot将jar包中有些类的初始化全部变成了读取配置文件方式

    ②starter定义了当前技术所依赖的jar包,达到减少依赖配置的目的

  • 使用任意坐标时,仅书写GAV中的G和A,V由SpringBoot提供,除非SpringBoot未提供对应版本V,由parent标签指定

image-20230316091442474

  • 下面这张图,点进去starter之后是parent提供的版本信息

    里面都是该技术所依赖的jar包及其默认版本,最终版本由标签里面的版本决定

    image-20230316091533008

image-20230316092012165

3.引导类

作用:

①Boot工程的执行入口

②SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean,初始化Spring容器

  • 扫包方式:当前引导类所在包及其子包

image-20230316092041184

4.内嵌Tomcat

内嵌Tomcat,启动服务器原理:

将Tomcat服务器作为bean对象,并将该对象交给Spring容器管理。当Spring容器启动时,spring容器自动运行tomcat-embed-core内嵌核心,而内嵌核心在spring-boot-starter-web中

  • 更换web服务器

    tomcat(默认):apache出品,粉丝多,应用面广,负载了若干较重的组件

    jetty:更轻量级,负载性能远不及tomcat

    undertow:负载性能勉强跑赢tomcat

    想更换只需更换对应starter即可

    image-20230316093135414

2.配置文件

1.核心配置文件

  • starter加载application.yml文件,spring-boot-starter里的这个starter是所有的SpringBoot的starter的基础依赖,里面定义了SpringBoot相关的基础配置

image-20230316093344575

2.属性配置

#设置springboot日志配置
logging.level.root=debug

3.配置文件

  • properties格式
  • yml格式**(主流格式)**
  • yaml格式
  • 配置文件优先级:(了解)

    application.properties > application.yml > application.yaml

    不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留

4.yaml文件

  • 书写核心规则:数据前面要加空格与冒号隔开

  • 格式:

    image-20230316095429100

    image-20230316095500411

5.yaml文件读取

  1. 读取单个数据规则

image-20230316100538399

  1. 读取特殊要求数据规则
  • 在配置文件中使用${}进行引用数据
  • 出现特殊字符,需要使用转义字符

image-20230316102045816

  1. 一次性读取全部数据,解决一次读取一个数据痛点

    使用Enviroment接口加载配置文件数据,使用相应方法读取

image-20230316102519464

缺点:无法做到针对性封装,下面引出针对性封装

  1. 针对性封装✏️

    步骤:

    ①设置一个与属性一一对应的实体类

    ②在实体类上加上@ConfigurationProperties(prefix = “属性前缀”)注解实现自动装配

image-20230316103550225

image-20230316104551486

image-20230316104607877

2.基于Springboot整合SSMP

整合过程一般就是导入相应技术的starter,这些starter有的提供好注解(@SpringbootTest),有的需要提供好配置信息

总之这些starter的作用提供jar包,并交给spring容器管理,通过配置文件来读取相关信息,初始化好相关的bean(如mybatis)

1.整合Junit

  • 本质上还是Spring的测试

  • 纯手工制作步骤:

    image-20230316110747902

    image-20230316110824167

1.注意classes位置⭐️

  • 如果测试类和引导类在一个包或者其子包中,那么会扫描到,不用管;

    image-20230316111229055

    否则要指定@SpringBootTest的classes属性为引导类名

  • 原理:通过找到引导类,来获取IOC容器,获取IOC容器中的对象。没有指定classes属性,那么就会在本包中搜索配置类,没找到爆错

2.整合Druid

原本需要DataSource属性后,配置在type里,现在导入starter后直接配置在自己的属性里

image-20230318100218525

5.整合第三方技术总结⭐️

image-20230318100258665

3.SSM整合案例

  • 分析

    image-20230318101204106

1.持久层:CRUD操作

1.基本流程

  • 导包的时候一定要相应技术与boot技术的整合包,便于开发

image-20230318105107564

  • image-20230318111101834

    image-20230318105221613

    image-20230318105240738

    image-20230318105306895

2.MP开启日志,便于看到内部执行过程

  • page对象中封装了分页的所有信息,IPage只是一个接口

3.分页功能

image-20230322141202565

image-20230322141059370

image-20230322141147460

4.条件查询

  • 1.创建查询对象
  • 2.为查询对象封装条件
  • 3.调用bookDao中的selectList方法去实现

image-20230322142054147

image-20230322142112754

2.业务层:

要与数据层功能区分开来,这里是一个个操作的集合

  • 借助mybatisplus快速开发Service

    如果不满足开发要求,那么手动加入到接口中,然后自己实现

    image-20230322150931472

    image-20230322150853601

3.表现层

  • 前端参数获取:
    • 参数在路径中,用@PathVarible注解获取
    • 参数是json格式,用@RequestBody + 实体类对象进行获取
  • image-20230322163419138

    表现层数据统一处理,解决返回格式乱的问题

    设置R对象,增加flagdata字段,flag用来表示查没查找。data用来处理查询到的数据

    R对象无固定格式,合理即可

image-20230322164237912

image-20230322164414248

3.1 前后端数据协议⭐️

  • Service层做操作的时候

    查询的返回结果为数据

    增删改,返回的数据为boolen类型

  • 表现层做返回值的时候

查询类全部的返回R全部用ture和对象,因为一定会查到

​ 查询单个数据有可能不返回true

增删改类的不一定能影响数据

​ 修改删除类的返回R,根据Service层影响数据来设置flag,不用设置data数据值

  • image-20230322165123995

    image-20230322165147206

4. 前后端调用⭐️

页面路径问题:

  • 普通的springbootweb项目,static下放页面
  • themeleaf的web项目,templates下放页面

4.1 Ajax发送异步请求

image-20230322173700593

image-20230322173747834

4.2 新增操作

  • 清理表单数据操作进行的地方:

    ①每次打开新增数据弹窗的时候

image-20230322185949813

image-20230322190004544

image-20230322190136938

image-20230322190637110

4.3 删除操作

  • 存在并发删除的时候,会报异常,这时候前端Ajax可以捕获异常处理
  • image-20230322191945571

    image-20230322192015499

4.4 修改操作

  • 列表功能(回显数据) + 新增功能组合

  • 调用方法一定为PUT,逻辑与增加数据一样

  • 注意点:

    image-20230323112438514

image-20230323161858465

4.5 异常处理⭐️

  • 异常处理目的:使前后端格式一致

    • 使用@RestControllerAdivce注解配置全局拦截器

    • 使用@ExceptionHandler(异常名称)捕获异常,并且写相应的方法处理

  • 再在R类中设置一个message属性,用来设置正常信息和异常信息

  • R实体类

    package com.example.util;
    
    import lombok.Data;
    
    /**
     * @author qin start
     * @create 2023-03-22-16:54
     */
    @Data
    public class R {
    
        private boolean flag;
        private Object data;
        private String msg;//用于提示异常信息
    
        public R() {
        }
    
        public R(boolean flag) {
            this.flag = flag;
        }
    
        public R(boolean flag, Object data) {
            this.flag = flag;
            this.data = data;
        }
    
        public R(String msg) {
            this.flag = false;
            this.data = null;
            this.msg = msg;
        }
    
        public R(boolean flag,String msg) {
            this.flag = flag;
            this.msg = msg;
        }
    }
    
    

image-20230323162056488

  • 后台异常处理:

    image-20230323163615315

  • 前后台消息格式统一

    image-20230323164412232

    image-20230323163829656

  • 总结:前后端无论是异常还是提示信息,都交给R中的msg处理,这样实现了提示消息的统一

image-20230323165926761

4.6 分页操作⭐️

  • BUG:

  • image-20230323174335609

  • 正常处理

  • 总结

    前台

    image-20230323174639411

    image-20230323174654624

    后端

  • 这里getPage方法中封装了方法:①创建一个分页Page②调用通用service的分页方法③返回一个page对象

image-20230323174813192

image-20230323171002803

image-20230323174847148

  • 分页产生的删除bug

    产生:(假设最后一页页码为3)

    删除最后一页的最后一条数据的时候之后再进行分页查询的时候,传递过去的分页当前页数据为3,但是分页最大只能为两页。

    由前端分页插件处理后,得出总分页大小为2页,当前页为第三页(这时候已经被总分页数据2覆盖了),因此会出现当前页为2,但是数据为空的现象

    image-20230323175910321

  • 处理:

    如果当前页面值超过最大分完页数之后,那么将分完页的总页数作为当前页数(为最大值)参数,重新进行分页,这样才能得到正确数据

  • 还存在问题:

    如果再进行大于判断的时候,又删除了几条数据,又会出现问题。这时候就要考虑锁机制

  • image-20230323175354123

4.7 按条件查询

  • 思路:将条件查询当成分页中的一部分数据

  • 就是将页面上数据收集,然后组织成参数,用selectPage(page,wrapper)处理即可

  • image-20230323192648051

  • image-20230323192703945

    image-20230323192723662

多次like默认连接SQL符号为and

image-20230323192929293

image-20230323193000813

4.8 总结

片转存中…(img-Pvb32rSa-1688197071750)]

  • 处理:

    如果当前页面值超过最大分完页数之后,那么将分完页的总页数作为当前页数(为最大值)参数,重新进行分页,这样才能得到正确数据

  • 还存在问题:

    如果再进行大于判断的时候,又删除了几条数据,又会出现问题。这时候就要考虑锁机制

  • [外链图片转存中…(img-UvhNb2Kh-1688197071751)]

4.7 按条件查询

  • 思路:将条件查询当成分页中的一部分数据

  • 就是将页面上数据收集,然后组织成参数,用selectPage(page,wrapper)处理即可

  • [外链图片转存中…(img-fPseVqvH-1688197071752)]

  • [外链图片转存中…(img-8zEYVk6U-1688197071753)]

    [外链图片转存中…(img-Sw0y4ytu-1688197071753)]

多次like默认连接SQL符号为and

[外链图片转存中…(img-oEcnlHiT-1688197071754)]

[外链图片转存中…(img-r589x3c8-1688197071755)]

4.8 总结

image-20230323195034727

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

理解 flask中request中form、data、json、values属性的区别

flask的request对象中关于请求参数的获取有几个不同的属性,例如 args、form、data、json。估计大部分人一开始也分不清什么情况下哪个属性有值,哪个属性没值,这篇文章全面整理了这几个属性之间的区别和使用场景。 flask.request对象其实是对HTTP请求的一种封装,我们知道HT…

Fidder抓包工具基础+postman调试测试

1、下载地址 汉化Fiddler Web Debugger(5.0.20192.25092)中文版 2、配置参数初始化 开启 fidder 百度即可 3、抓包 核心&#xff1a; 入参 出参 4、如何把包的数据放到postman发生请求 保存一个文件&#xff0c;选择格式 保存文件 自定义名称 将har 包托人 postman 即可 &…

华为OD机试真题B卷 Python 实现【箱子之形摆放】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 要求将一批箱子按从上到下以‘之’字形的顺序摆放在宽度为 n 的空地上&#xff0c;输出箱子的摆放位置&#xff0c;例如&#xff1a;箱子ABCDEFG&am…

Autosar诊断实战系列08-Dem与BswM在ECU运行期间究竟擦出了哪些火花

本文框架 前言1. Dem与BswM交互内容先睹为快2 Dem与BswM交互的配置开发2.1 ESH_DemInit Rule2.2 Dem_Shutdown的处理规则3. Dem在初始化及Shutdown期间的工作内容3.1 Dem初始化期间工作内容3.2 Dem_ShutDown期间工作内容前言 在本系列笔者将结合工作中对诊断实战部分的应用经验…

九齐NY8A051D硬件IR模块的配置和使用以及解码处理

写在前面 最近在群里有看到有小伙伴在问九齐的硬件IR模块&#xff0c;突然想起来我好像用过&#xff0c;找了半天才把项目找出来&#xff0c;写篇博客记录一下方便下次使用和寻找。 按道理来说九齐所有内置硬件IR模块的MCU都是可以用类似的方法配置和使用的&#xff0c;举一反…

packaged_task创建异步任务

本文将介绍基本的packaged_task的用法&#xff1a; 看完上述代码后一定有疑问&#xff1a; 为什么要有packaged_task&#xff1f; 解答&#xff1a;上文的线程通信代码如下&#xff1a; 功能主要是做了求两数之和&#xff0c;然而一般情况下&#xff0c;我们并不习惯这样编写子…

Hive(15):Table(表)DDL操作

1 Describe table Hive中的DESCRIBE table语句用于显示Hive中表的元数据信息 describe formatted [db_name.]table_name; describe extended [db_name.]table_name; 如果指定了EXTENDED关键字,则它将以Thrift序列化形式显示表的所有元数据。如果指定了FORMATTED关键字,则它…

大数据Doris(五十三):MySQL Dump 导出

文章目录 MySQL dump 导出 一、Dump导出案例 二、注意事项 MySQL Dump 导出 mysqldump是一个常用的 MySQL 数据库备份工具&#xff0c;它可以将 MySQL 数据库中的数据导出为 SQL 格式的文件&#xff0c;从而实现对数据的备份、迁移和恢复等操作。Doris 在0.15 之后的版本已…

Flutter 实现任意控件拖动功能

文章目录 前言一、如何实现&#xff1f;1、使用GestureDetector响应拖动事件2、使用Transform变换控件位置3、计算活动区域 二、完整代码三、使用示例1、基本用法 总结 前言 使用flutter开发是需要控件能拖动&#xff0c;比如画板中的元素&#xff0c;或者工具条&#xff0c;搜…

递归入门-数据结构和算法教程

什么是递归&#xff1f; 函数直接或间接调用自身的过程称为递归&#xff0c;相应的函数称为递归函数。使用递归算法&#xff0c;某些问题可以很容易地解决。这样的问题的示例是河内塔&#xff08;TOH&#xff09;、中序/前序/后序树遍历、图的DFS等。递归函数通过调用自身的副…

网络安全(黑客)自学建议

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员…

基于微信小程序的英语单词记忆系统的设计与实现(论文+源码)_kaic

摘 要 当前时期&#xff0c;国内的经济获得了非常快速的发展&#xff0c;互联网技术在持续的创新和完善&#xff0c;教育教学方面也在不断的进步&#xff0c;教育全面深化改革在发展&#xff0c;并且移动互联网技术在教育领域获得了大量的实践以及应用。语言的全球化慢慢的变…

【算法】01背包和完全背包

文章目录 背包问题概览01背包二维dp数组写法一维dp数组写法 完全背包关于遍历顺序相关题目[416. 分割等和子集](https://leetcode.cn/problems/partition-equal-subset-sum/)[279. 完全平方数](https://leetcode.cn/problems/perfect-squares/)[518. 零钱兑换 II](https://leet…

【webrtc】vs2017 重新构建m98

配置了一台13900k的主机,需要重新配置webrtc 构建环境代码已经gclient sync 同步好了,打算重新构建:vs2017 的win10 sdk最大17763 vs2017 环境 set vs2017_install=S:\Program Files (x86)\Microsoft Visual Studio\2017\Communitywin10 SD

Python_上下文管理器

目录 上下文管理器类 多上下文管理器 contextmanager实现上下文管理器 上下文管理器(context manager)是 Python 编程中的重要概念&#xff0c;用于规定某个对象的使用范围。一旦进入或者离开该使用范围&#xff0c;会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语…

【Kubernetes资源篇】ConfigMap配置管理中心详解

文章目录 一、ConfigMap配置中心理论知识1、ConfigMap配置中心简介2、ConfigMap局限性 二、创建ConfigMap的四种方式1、第一种&#xff1a;通过命令行创建ConfigMap2、第二种&#xff1a;通过指定文件创建ConfigMap3、第三种&#xff1a;通过指定目录创建ConfigMap4、第四种&am…

C++线程池(1)理论基础及简单实现

写过CURD的程序员肯定都熟悉“数据库连接池”这个东西&#xff0c;数据库连接是个昂贵的东西&#xff0c;因为它的创建过程比较耗费资源。所以为了节约资源、提高数据库操作的性能&#xff0c;“数据库连接池”就应运而生了。 其实线程池跟数据库连接池类似&#xff0c;一个线…

《PyTorch深度学习实践》第七讲 处理多维特征的输入

b站刘二大人《PyTorch深度学习实践》课程第七讲处理多维特征的输入笔记与代码&#xff1a;https://www.bilibili.com/video/BV1Y7411d7Ys?p7&vd_sourceb17f113d28933824d753a0915d5e3a90 Diabetes Dataset 每一行是一个记录每一列是一个特征&#xff0c;每个样本有8个特征…

为什么我们家里的IP都是192.168开头的?

为什么我们家里的IP都是192.168开头的&#xff1f; 本文为掘金社区首发签约文章&#xff0c;14天内禁止转载&#xff0c;14天后未获授权禁止转载&#xff0c;侵权必究&#xff01; 是的&#xff0c;还是我小白&#xff0c;什么技术博主&#xff0c;老情感博主了。 来讲个故事。…

网络安全合规-数据安全分类分级

数据安全是指保护数据免受未经授权的访问、使用、泄露、破坏或篡改的措施。数据安全包括物理安全、网络安全、应用程序安全、数据备份和恢复等方面。 数据分级分类是指根据数据的重要性和敏感程度&#xff0c;将数据划分为不同的级别&#xff0c;并根据不同级别的数据制定不同…