【SpringBoot】从入门到精通的快速开发指南

news2024/11/19 14:53:43

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《SpringBoot》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

目录

一、SpringBoot简介

1.1.什么是SpringBoot

1.2.为什么要学习SringBoot

1.3.SpringBoot的特点

二、入门SpringBoot

2.1.创建SpringBoot项目

2.1.1.测试springboot

2.2.集成mybatis

2.2.1.properties修改为.yml

 2.2.2.添加mybatis配置文件

 2.2.3.生成mapper代码

2.2.4.测试连接数据库

2.3.集成pagehelper

2.3.1.基础使用pagehelper

2.3.2.AOP使用pagehelper

2.4.集成druid

三、注意事项

3.1.SpringBoot换源失败

3.2.代码不加载

3.3.yml文件注意格式

3.4.IDEA连接数据库错误


一、SpringBoot简介

1.1.什么是SpringBoot

Spring Boot 是由 Pivotal 团队提供的全新框架,2014 年 4 月发布 Spring Boot 1.0 2018 年 3 月 Spring Boot 2.0发布。它是对spring的进一步封装,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。怎么简化的呢?就是通过封装、抽象、提供默认配置等方式让我们更容易使用。

  SpringBoot 基于 Spring 开发。SpringBoot 本身并不提供 Spring 框架的核心特性以及扩展功能,也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具

  关于 SpringBoot 有一句很出名的话就是约定大于配置。采用 Spring Boot 可以大大的简化开发模式,它集成了大量常用的第三方库配置,所有你想集成的常用框架,它都有对应的组件支持,例如 Redis、MongoDB、Jpa、kafka,Hakira 等等。SpringBoot 应用中这些第三方库几乎可以零配置开箱即用,大部分的 SpringBoot 应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。

1.2.为什么要学习SringBoot

众所周知 Spring 应用需要进行大量的配置,各种 XML 配置和注解配置让人眼花缭乱,且极容易出错,因此 Spring 一度被称为“配置地狱”。为了简化 Spring 应用的搭建和开发过程,Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架,它就是Spring Boot。

只是为了提升Spring开发者的工具,特点:敏捷式、快速开发。

  1. 快速上手:Spring Boot 提供了一套简化的开发模型和自动配置机制,使得开发者能够快速搭建起一个可运行的应用程序。相比传统的 Spring 开发,Spring Boot 大大简化了繁琐的配置过程,让开发者能够更专注于业务逻辑的实现。

  2. 生态丰富:Spring 生态系统非常庞大,Spring Boot 在此基础上提供了更加便捷的开发方式。它内置了许多常用的库和工具,如数据库访问、Web 开发、安全认证等,使得开发者能够更轻松地集成这些功能,而无需自己手动配置。

  3. 高效开发:Spring Boot 提供了许多开发中常用的功能和组件,如自动装配、自动配置、监控和管理等,极大地提高了开发效率。通过使用 Spring Boot,开发者可以快速构建出高质量的应用程序,同时还能够更加方便地进行测试、部署和维护。

  4. 社区支持广泛:Spring Boot 是 Spring 社区的重要组成部分,因此拥有一个庞大的社区支持。无论是在官方文档、教程还是开源社区中,都能够找到大量的资源和解决方案,帮助开发者解决问题、学习和提高。

1.3.SpringBoot的特点

  • 独立运行的 Spring 项目

Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令“ java–jar xx.jar” 即可运行。

  • 内嵌 Servlet 容器

Spring Boot 使用嵌入式的 Servlet 容器(例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成 WAR 包 。

  • 提供 starter 简化 Maven 配置

Spring Boot 提供了一系列的“starter”项目对象模型(POMS)来简化 Maven 配置。

  • 提供了大量的自动配置

Spring Boot 提供了大量的默认自动配置,来简化项目的开发,开发人员也通过配置文件修改默认配置。

  • 自带应用监控

Spring Boot 可以对正在运行的项目提供监控。

  • 无代码生成和 xml 配置

Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。

二、入门SpringBoot

2.1.创建SpringBoot项目

①打开Idea点击 + Create New Project,选择 Spring Initializr

②点击Next下一步

 ③勾选所需依赖

点击Next下一步,最后点击Finish即可完成SpringBoot项目的创建。

2.1.1.测试springboot

插件之间可能存在配置关系,比如Mybatis Framework,这个插件就是需要自己配置数据库,如果不配置,那么启动项目是会报错的,所以我们来配置一下避免运行时报错,我们这里使用的是不添加数据库配置,加入注解直接让其排除自动配置

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

 启动后看见如下图就说明启动成功了(SpringBoot不需要配置Tomcat,他内嵌了一个在里面)

为了能比较的清楚的看到效果,我们在 com.zking.springboot 包下又创建一个 controller 包,并在该包内创建一个名为 HelloController 的 Controller,代码如下:

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
        return "Hello SpringBoot!!!";
    }
}

 启动SpringBoot后访问路径得到如下图,说明我们的SpringBoot项目以及搭建好了

2.2.集成mybatis

2.2.1.properties修改为.yml

在这之前,我们需要做一件事情,下载插件 Convert YAML and Properties File

该插件是将我们的配置文件.properties直接变成.yml,这样的好处是什么呢?这样可以更直观的知道我们所配置的信息,让我们的配置变得有层级更好的管理。

原properties

修改成yml

下载好插件,重启IDEA后选择properties文Convert YAML and Properties File即可

 2.2.2.添加mybatis配置文件

配置pom.xml,导入依赖:

         <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.3.0</version>
        </dependency>

在创建springboot项目的时候勾选了,就不用管。

往application.yml或application.properties文件,添加以下配置:

#mybatis配置
mybatis:
        #配置SQL映射文件路径
        mapper-locations: classpath:mapper/*.xml
        #配置别名
         type-aliases-package: com.csdn.springboot.pojo

在启动类上添加@MapperScan注解:

@MapperScan({"com.csdn.springboot.mapper"})

 2.2.3.生成mapper代码

①点击Datebase后点击加号进行mysql连接

②填写相应信息

③ 在需要生成代码的表上右击MybatisX-Generator

 ④生成mapper代码

至此我们的代码就生成好了

2.2.4.测试连接数据库

代码生成完成了下面我们测试一下

mapper.xml

    <select id="selectBook"  resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from t_book
    </select>

mapper

@Repository
public interface TBookMapper {
    List<TBook> selectBook();
}

service

public interface TBookService {

    List<TBook> selectBook();
}

serviceimpl

@Service
public class TBookServiceImpl implements TBookService {
    @Autowired
    private TBookMapper tBookMapper;
    @Override
    public List<TBook> selectBook() {
        return tBookMapper.selectBook();
    }
}

controller

@RestController
@RequestMapping("/book")
public class TBookController {
    @Autowired
    private TBookService tbookservice;

    @RequestMapping("/list")
    public Object list(){
        return tbookservice.selectBook();
    }
}

请求访问路径:http://localhost:8080/book/list

2.3.集成pagehelper

2.3.1.基础使用pagehelper

普通的查询肯定不满住我们日常需求,按道理肯定是只查询一部分数据显示给用户看,这就需要用到pagehelper依赖了,通过它进行分页查询。

配置pom.xml,导入依赖:

    <!-- 分页依赖-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

application.yml或application.properties文件,添加以下配置:

#pagehelper分页插件配置
pagehelper:
  #sql“方言”
  helperDialect: mysql
  #开启分页合理化
  reasonable: true
  #mapper方法上的参数
  supportMethodsArguments: true
  #查询数量
  params: count=countSql

我这里先测试一下,手动设置查询条件

 这时,我们的数据就会是分页的了,不再是一次性全部查询出来

2.3.2.AOP使用pagehelper

先准备三样东西,PageBean\PageAspect\PageAnnotation

PageBean

package com.csdn.boot.page;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class PageBean {

    private Integer page = 1;
    private Integer rows = 5;
    private Long total = 0L;
    private boolean open = true;

    public int start() {
        return (page - 1) * rows;
    }

    public int previous() {
        return Math.max(this.page - 1, 1);
    }

    public int next() {
        return Math.min(this.page + 1, maxPage());
    }

    public int maxPage() {
        return (int) Math.ceil(this.total.intValue() / (this.rows * 1.0));
    }

}

PageAspect

package com.csdn.boot.page;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class PageAspect {

    @Pointcut("@annotation(PageAnnotation)")
    public void cut() {
    }

    @Around("cut()")
    public Object aroundHandler(ProceedingJoinPoint point) throws Throwable {
        Object[] args = point.getArgs();
        PageBean pageBean = new PageBean().setOpen(false);
        for (Object arg : args) {
            if (arg instanceof PageBean) pageBean = (PageBean) arg;
        }
        PageHelper.startPage(pageBean.getPage(), pageBean.getRows(), pageBean.isOpen());
        Object val = point.proceed();
        if (pageBean.isOpen()) {
            Page<?> page = (Page<?>) val;
            pageBean.setTotal(page.getTotal());
        }
        return val;
    }

}

PageAnnotation

package com.csdn.boot.page;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PageAnnotation {
}

准备好了后,就可对我们的代码进行修改了

controller层

@RequestMapping("/list")
    public Object list(PageBean pageBean) {
        PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        return tbookservice.selectBook(pageBean);

    }
}

 service层

public interface TBookService {

    List<TBook> selectBook(PageBean pageBean);

}

 serviceimpl层

@Service
public class TBookServiceImpl implements TBookService {
    @Autowired
    private TBookMapper tBookMapper;

    @PageAnnotation
    @Override
    public List<TBook> selectBook(PageBean pageBean) {
        return tBookMapper.selectBook();
    }
}

演示效果:

2.4.集成druid

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。

 配置pom.xml,导入依赖:

    <!--druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.15</version>
        </dependency>

 application.yml或application.properties文件,添加以下配置:

spring:
  datasource:
    #1.JDBC
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/vue?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: 1234
    druid:
      #2.连接池配置
      #初始化连接池的连接数量 大小,最小,最大
      initial-size: 5
      min-idle: 5
      max-active: 20
      #配置获取连接等待超时的时间
      max-wait: 60000
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 30000
      validation-query: SELECT 1 FROM DUAL
      test-while-idle: true
      test-on-borrow: true
      test-on-return: false
      # 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filter:
        stat:
          merge-sql: true
          slow-sql-millis: 5000
      #3.基础监控配置
      web-stat-filter:
        enabled: true
        url-pattern: /*
        #设置不统计哪些URL
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        session-stat-enable: true
        session-stat-max-count: 100
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: true
        #设置监控页面的登录名和密码
        login-username: admin
        login-password: admin
        allow: 127.0.0.1
        #deny: 192.168.1.100

我们直接重启服务器随便发个请求到后端,根据监控页面的网址进行访问

就可以在这里实时监控到用户发送的请求了

三、注意事项

3.1.SpringBoot换源失败

不知道大家有没有见过以下图片,该图片就是Spring Initializr创建项目换源,出现的错误

解决办法:

 ①  用阿里云https://start.aliyun.com/ 地址直接替代或者使用大佬的http://start.springboot.io/即可

 ② 直接进入spring提供的官网后如果没有合适自己的jdk版本也没关系,直接在构建完的springboot项目中修改pom.xml文件即可。

注意选择Custom

3.2.代码不加载

我们的代码要放到与启动类同级包下,否则访问不到该资源,如果是静态资源或者配置文件请放入resources文件下。

3.3.yml文件注意格式

正确的层级关系

在这个例子中,我们将创建一个包含一些用户信息的yml文件。

users:
  - name: Alice
    age: 28
    gender: Female
  - name: Bob
    age: 34
    gender: Male

在这个例子中,我们的层级关系是正确的。users是顶级键,它下面有两个列表元素,每个元素都是一个字典,表示一个具体的用户。

错误的层级关系

现在让我们看一下错误的层级关系。在这个例子中,我们将创建一个包含用户信息的yml文件,但是我们不小心缩进了一些键。

users:
- name: Alice
  age: 28
   gender: Female
- name: Bob
  age: 34
   gender: Male

在这个例子中,我们缩进了gender键,导致它的层级关系不正确。因此,这个yml文件是无效的。

3.4.IDEA连接数据库错误

可以在连接字符串中添加"serverTimezone"属性并设置正确的时区值

jdbc:mysql://localhost:3306/bookshop?serverTimezone=UTC

 请添加图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

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

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

相关文章

【开源软件】最好的开源软件-2023-第14名 Appsmith

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

解决下载huggingface模型权重无法下载的问题

文章目录 方法一(推荐)方法二方法三依然存在的问题 由于某些原因&#xff0c;huggingface的访问速度奇慢无比&#xff0c;对于一些模型(比如大语言模型LLM)的权重文件动辄几十上百G&#xff0c;如果用默认下载方式&#xff0c;很可能中断&#xff0c;这里推荐几种方式。 方法一…

Qt容器QScrollArea小部件的滚动视图

​# QScrollArea 平台:linux、windows、mac皆可,Qt版本:Qt5.14.2 QScrollArea是Qt框架中用于提供可滚动视图区域的小部件。它通常被用来包含一个较大的内容区域,并且可以在其中嵌入其他小部件。下面是一些常用的QScrollArea函数: 1. `setWidget(QWidget *widget)`: 设置在…

八大排序(插入排序 | 选择排序 | 冒泡排序)

在我们内存中我们一般会有一些没有顺序的数据&#xff0c;我们成为内排序&#xff0c;而今天分享八大排序的是时间复杂度为O&#xff08;N^2&#xff09;的插入排序&#xff0c;选择排序和教学意义比较强的冒泡排序。 插入排序 这是插入排序的动图&#xff0c;通过动图我们也…

pom打包跳过不含main方法的pom工程

Unable to find main class 总pom包已经有打包插件 不包含main方法的工程中的pom配置如下配置 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><con…

KaiwuDB 获评信通院 2023 大数据“星河”标杆案例

12月6日&#xff0c;由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601) 共同组织的 2023 大数据“星河(Galaxy)”案例评选结果正式公示&#xff0c;“基于 KaiwuDB 的台区云储能示范项目”历经多环节严苛评审&#xff0c;从累计 706 份申报项目中…

JVM虚拟机系统性学习-JVM调优实战之内存溢出、高并发场景调优

调优实战-内存溢出的定位与分析 首先&#xff0c;对于以下代码如果造成内存溢出该如何进行定位呢&#xff1f;通过 jmap 与 MAT 工具进行定位分析 代码如下&#xff1a; public class TestJvmOutOfMemory {public static void main(String[] args) {List<Object> list…

如何快速制作一个属于自己的网站

在现在这个数字化的时代&#xff0c;有一个属于自己的网站逐渐的成为了展示自己或企业形象、推广产品和服务的重要手段之一。对于小白来说制作一个网站可能听起来很复杂和困难&#xff0c;但其实实际上随着技术的发展和各种网站建设工具的出现&#xff0c;制作一个属于自己的网…

C语言——模拟strcpy函数

代码实现&#xff1a; #include<stdio.h>void mystrcpy(char *des,char *src) {int i0;while(src[i]!\0){des[i]src[i];i;}des[i]\0;//也可以用下面的方法//while(*src!\0)//{// *des*src;// des;// src;//}//*des\0;//或者下面方法//while(*des *src)//{// …

linux应用层编程问题--沙雕问题

1.调用沁恒 USB读取接口 读不到数据 static bool CH37XASyncReadData(int iIndex, uint32_t epindex, void *oBuffer, uint32_t *ioLength) {struct _bulkUp {uint32_t len;uint8_t epindex;uint8_t data[0];} __attribute__((packed));struct _bulkUp *bulkUp;int retval;bul…

计算机毕业设计 基于SpringBoot的日常办公用品直售推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

MES管理系统执行过程中的动态批次管理

MES生产管理系统是现代制造业中非常重要的生产管理工具&#xff0c;它能够有效地协调和监控生产过程。在MES管理系统中&#xff0c;动态批次管理技术发挥着关键作用&#xff0c;对于提高生产效率和质量具有重要意义。本文将详细介绍MES管理系统中的动态批次管理技术及其在生产过…

【教3妹学编程-算法题】反转二叉树的奇数层

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;“你不是真正的快乐&#xff0c; 你的…

正则表达式:简化模式匹配的利器

正则表达式&#xff1a;简化模式匹配的利器 一、正则表达式简介1.1 正则表达式介绍1.2 正则表达式使用场景 二、正则表达式语法2.1 正则表达式元字符和特性2.2 正则表达式常用匹配 三、正则表达式实战3.1 常见的正则表达式用法3.2 正则表达式的过滤用法3.3 正则表达式的代码用法…

Python移动未标注的图片数据集

Python移动未标注的图片数据集 前言前提条件相关介绍实验环境Python移动未标注的图片数据集情况一&#xff1a;有图&#xff0c;无标注文件代码实现输出结果 情况二&#xff1a;有图&#xff0c;有标注文件&#xff0c;但标注信息为空代码实现输出结果 情况一与情况二同时都考虑…

input、el-input输入框输入规则

一、input 只能输入框只能输入正整数&#xff0c;输入同时禁止了以0开始的数字输入&#xff0c;防止被转化为其他进制的数值。 <!-- 不能输入零时--> <input typetext οninput"valuevalue.replace(/^(0)|[^\d]/g,)"><!-- 能输入零时--> <inp…

C# WPF上位机开发(利用tcp/ip网络访问plc)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 c# wpf如果是用来开发非标上位机的&#xff0c;那么和plc的通信肯定是少不了的。而且&#xff0c;大部分plc都支持modbus协议&#xff0c;所以这个…

call 和 apply:改变对象行为的秘密武器(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

LabelStudio数据标注详细方法

文章目录 情感分析任务Label Studio使用指南1. label-studio 安装2. label-studio 项目创建3. 情感分析任务标注3.1 语句级情感分类任务3.2 属性级情感分析任务3.2.1 属性-情感极性-观点词抽取&#xff08;1&#xff09;Span类型标签&#xff08;2&#xff09;Relation类型标签…

STL中sort的底层实现

文章目录 1、源码分析2、算法优化3、总结 在讲解STL中sort的底层原理之前&#xff0c;先引申出这样几个问题&#xff1f; ①STL中sort的底层是采用哪种或者哪几种排序&#xff1f; ②STL中sort会导致栈溢出吗&#xff1f; ③快速排序的时间复杂度是不稳定的 l o g 2 n log_2n l…