前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot 2.x 教你快速入门

SpringBoot 2.x 教你快速入门

作者头像
AI码真香
发布2022-09-13 17:50:06
8050
发布2022-09-13 17:50:06
举报
文章被收录于专栏:AI码真香
一、SpringBoot 简介
1.1、SpringBoot 是什么?
  • 产生背景:Spring开发变的越来越笨重,大量的XML文件,繁琐的配置,复杂的部署流程,整合第三方技术时难度大等,导致开发效率低下。
  • SpringBoot是一个用来简化Spring应用的初始化创建和开发的框架,简化配置,实现快速开发。
  • SpringBoot是SpringMVC的升级版,两者没有必然的联系,如果没有学习过SpringMVC的童鞋也可以直接上手SpringBoot。
1.2、为什么使用SpringBoot

优点:

  • 快速创建独立运行的Spring应用并与主流框架集成
  • 内置Servlet容器,应用无需打包war包
  • 使用starter(启动器)管理依赖并进行版本控制
  • 大量的自动配置,简化开发
  • 提供了准生产环境的运行时监控,如指标、 健康检查、外部配置等
  • 无需配置XML,没有生成冗余代码,开箱即用
  • 微服务的入门级框架
二、第一个SpringBoot应用
2.1、简介

前置知识:

  • 具备必要的前置知识 :
代码语言:javascript
复制
利用maven构建项目
Spring注解
RESTful API
  • 可以不需要先去学SpringMVC
  • Java、Maven等版本保持一致

推荐环境:

  • SpringBoot 2.0(基于Spring5.0)
  • JDK 1.8及以上
  • Maven 3.2及以上
  • Tomcat 8.5及以上
  • IntelliJ IDEA
2.2、步骤

可以在spring官网 https://start.spring.io/ 上建项目,也可以用idea构建。官网上直接生成项目如下:

本案例使用IDEA 来创建一个 SpringBoot 项目:

  • 新建一个SpringBoot项目,
  • 点击下一步:
  • 继续下一步:
  • 下一步,会开始下载选择的依赖包,等完成下载完成后,即创建成功。目录结构如下:

说明:

  1. 默认生成的.mvn、.gitignore等可以删除
  2. POM文件和主程序类都已经生成好了,直接写业务逻辑即可
  3. resources文件夹的目录结构
代码语言:javascript
复制
	|-resources
    	|-static  存放静态资源,如 css js images
    	|-templates  存放模板页,可以使用模板引擎,如freemarker、velocity、theamleaf等
    	|-application.properties  SpringBoot应用的配置文件
  • 新建一个 HelloController 类(最好保证启动类:GirlApplication 处于最外层路径哦,它会扫描加载同级目录或其下一级目录的文件)
代码语言:javascript
复制
package com.xmlvhy.girl.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * Author: 小莫
 * Date: 2019-01-17 19:11
 * Description:<描述>
 */
@RestController
public class HelloController {

    @RequestMapping(value = "/hello" , method = RequestMethod.GET)
    public String say(){
        return "Hello SpringBoot!";
    }
}
  • 启动项目,有三种方式:

1. 在 IDEA 中启动,进入 GirlApplication 启动类中运行

2. 在项目根路径下执行maven命令: mvn spring-boot:run

3. 在项目跟路径下执行 maven 命令, 先执行 mvn install :

进入 target ,到target目录下后, 再执行 : java -jar girl-0.0.1-SNAPSHOT.jar

4. 启动成功后,访问:http://ip:端口/hello ,效果如下 :

三、属性配置文件
3.1、SpringBoot 配置文件默认有两种

文件名固定,放在 classpath:/ 或 classpath:/config 目录下 :

  • application.properties
  • application.yml
代码语言:javascript
复制
YAML用法:
	YAML不是一种标记语言
	YAML是专门用来写配置文件的语言,比xml、properties更适合作为配置文件
	YAML文件的后缀是.yml或.yaml

语法规则:
	大小写敏感
	使用缩进表示层级关系
	缩进时不允许使用Tag键,只允许使用空格
	缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
	`#`表示注释

根据个人喜好选择一种配置文件类型吧,我比较喜欢 application.properties ,本篇也是以这个为主!

3.2、SpringBoot 配置文件中添加属性

在 aplication.properties 文件中添加属性,如何在类文件中读取到属性呢 ?

代码语言:javascript
复制
#配置端口号
server.port=8082
#配置属性
name=jack
age=18

在HelloController类中读取 :

代码语言:javascript
复制
package com.xmlvhy.girl.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * Author: 小莫
 * Date: 2019-01-17 19:11
 * Description:<描述>
 */
@RestController
public class HelloController {

    @Value("${name}")
    private String name;

	//在属性文件中无需指定数据类型,在类中声明类型即可
    @Value("${age}")
    private Integer age;

    @RequestMapping(value = "/hello" , method = RequestMethod.GET)
    public String say(){
        //return "Hello SpringBoot!";
        return name +" "+ age;
    }
}

浏览器地址栏中输入:http://localhost:8082/hello:

如果想要在配置文件中,引用配置文件中的属性,那么可以通过下面这种配置:

代码语言:javascript
复制
#配置端口号
server.port=8082
#配置属性
name=jack
age=18
content=name: ${name}, age: ${age}

Java类中同样方式引用:

代码语言:javascript
复制
package com.xmlvhy.girl.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * Author: 小莫
 * Date: 2019-01-17 19:11
 * Description:<描述>
 */
@RestController
public class HelloController {

    //@Value("${name}")
    //private String name;
    //@Value("${age}")
    //private Integer age;

    @Value("${content}")
    private String content;
    @RequestMapping(value = "/hello" , method = RequestMethod.GET)
    public String say(){
        //return "Hello SpringBoot!";
        //return name +" "+ age;
        return content;
    }
}

效果如下:

可能有人会想到 : 两个属性还好,要是很多属性呢?那么我们继续修改配置文件,相当于建立一个分组,就需要用到这两个注解 : @Component @ConfiguartionProperties

新添加一些属性:

代码语言:javascript
复制
#配置端口号
server.port=8082
#配置属性
test.name=jack
test.age=18
test.sex=Man
#content=name: ${name}, age: ${age}

新建一个类 :

代码语言:javascript
复制
package com.xmlvhy.girl.entity;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * Author: 小莫
 * Date: 2019-01-17 21:29
 * Description:
 */
@Component //将当前Bean添加到容器中
//默认读取全局配置文件获取值,将当前类中的属性与配置文件中的test前缀进行绑定,这个可以自定义的
@ConfigurationProperties(prefix = "test")
@NoArgsConstructor //生成无参的构造方法
@Data //lombok插件的注解,默认帮生成 setter getter 和toString()方法
public class PersonProperties {
    private String name;
    private Integer age;
    private String sex;
}

在 HelloController 中引用 :

代码语言:javascript
复制
package com.xmlvhy.girl.web;

import com.xmlvhy.girl.entity.PersonProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * Author: 小莫
 * Date: 2019-01-17 19:11
 * Description:<描述>
 */
@RestController
public class HelloController {

    //@Value("${name}")
    //private String name;
    //@Value("${age}")
    //private Integer age;
    //@Value("${content}")
    //private String content;
    @Autowired
    private PersonProperties personProperties;
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String say() {

        //return "Hello SpringBoot!";
        //return name +" "+ age;
        //return content;
        return personProperties.toString();
    }
}
3.3、SpringBoot 多环境配置

可以为不同环境提供不同中的配置信息,如开发环境、测试环境、生产环境。我们可以将application.properties 复制两份,分别命名(随意)为:application-dev.properties(表示开发环境) application-pro.properties(表示生产环境) :

具体使用哪一个配置,在主配置文件 application.properties 中指定 :

代码语言:javascript
复制
//表明使用开发环境下的配置
spring.profiles.active=dev
//表明使用生产环境下的配置
//spring.profiles.active=pro

当然,不管生产环境还是开发环境,主配置文件中的配置都会生效(一般都是各环境下通用的一些配置)

备注:java -jar 启动项目可以指定一种配置环境,这时候你也可以通过IDEA中启动同项目的另外一种配置环境,注意端口需要修改一下。这样也就实现多环境了

代码语言:javascript
复制
java -jar  girl-0.0.1-SNAPSHOT.jar –spring.profiles.active=pro
四、Controller的使用
4.1、简介
代码语言:javascript
复制
@Controller:处理http请求
@RestController:Spring4之后新的注解,原来返回json需要@ResponseBody配合@Controller
@RequestMapping:配置url映射

单独使用 Controller 注解时,在MVC里,是需要返回ModelAndView等类型的类或者页面;但如使用 @RestController 注解,表示给前端提供RESTful风格的接口返回一些json格式数据。

@Controller 这个和在spingmvc没啥区别;@RestController 用了这个之后,就可以省掉两个注解@Controller和@RequestBody。

@RestController = @ResponseBody + @Controller

4.2、处理请求中的参数
代码语言:javascript
复制
@PathVariable:获取url中的数据
@RequestParam:获取请求参数的值
@GetMapping: 组合注解 表示 @RequestMapping(value="...",method= RequestMethod.GET) 其他同理
代码语言:javascript
复制
@RequestMapping(value = "/get/{name}",method = RequestMethod.GET)
public String getName(@PathVariable String name){
    return name;
}

如上这种方式: @PathVariable 获取url中的数据例如 "/get/{name}",浏览器中输入:http://localhost:8082/get/小莫 ,看下效果:

那如果我们不传 name 呢?看会怎么样:

出错了,提示404找不到!!就是说url中必须要有这个参数。

我们接下来看下另外一种请求参数:

代码语言:javascript
复制
@RequestMapping(value = "/get")
  public String getId(@RequestParam("id") String id){
      return id;
}

@RequestParam获取请求参数的值,我们在浏览器地址栏中输入:http://localhost:8082/get?id=666666 ,效果如下:

如果我们访问这个:http://localhost:8082/get ,看下会有什么结果:

返回 400 ,客户端非法请求,提示请求参数 id 没有;这时候我们可以这样解决这个问题:

代码语言:javascript
复制
//required = false;表示该参数非必须
//defaultValue = "123456";表示没有填写参数时候默认给的参数值
@RequestMapping(value = "/get")
public String getId(@RequestParam(value = "id",required = false,defaultValue = "123456") String id){
        return id;
}

修改后,我们再次访问:http://localhost:8082/get ,效果如下:

这时候可以看到,不报错了,并且将我们设定的默认值 123456 返回来。同样我们在浏览器输入栏中输入:http://localhost:8082/get?id=666666

也能把我们预期的内容返回给我们。

五、操作数据库

SpringBoot 结合 Spring-Data-Jpa 使用,实现对数据库的操作。Spring-Data-Jpa 定义了一系列对象持久

化的标准,目前实现这一规范的产品有Hibernate.TopLink等。

5.1、POM.xml中添加相关依赖
代码语言:javascript
复制
<!--jpa的依赖jar-->
<dependency>
	<groupId>org.springframework.boot</groupId>
  	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!--mysql 数据库的连接驱动-->
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.47</version>
</dependency>
5.2、新建一个实体类 User
代码语言:javascript
复制
package com.xmlvhy.girl.entity;

import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 * Author: 小莫
 * Date: 2019-01-18 17:43
 * Description:<描述>
 */
@Entity //表示该类映射数据库中的表
@Data //lombok插件注解,默认生成setter getter toString()方法,没有插件的话,自己手动生成即可
@NoArgsConstructor //无参构造方法,jpa 这块需要映射数据库的实体类有个无参的构造方法
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private Integer age;
}
5.3、添加数据库配置

首先我们先创建一个数据库: test (名称随意),然后在 application.properties 中添加如下配置:

代码语言:javascript
复制
#配置端口号
server.port=8082
#配置属性
test.name=jack
test.age=18
test.sex=Man
#content=name: ${name}, age: ${age}

#通用数据库配置
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=数据库账户
spring.datasource.password=数据库的密码

# Hikari 数据源专用配置
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5

#jpa相关配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
#springboot 2.x 不加这句则默认为myisam引擎,该引擎不会事务回滚,添加如下可将引擎修改为innodb,事务可回滚
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

此时我们运行项目,查看数据库 test 。你会发现它自动帮我们生成一个 user 表:

这时候,我们可以添加一些数据,以便后面测试 :

5.4、创建一个 DAO 类
代码语言:javascript
复制
package com.xmlvhy.girl.Dao;

import com.xmlvhy.girl.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * Author: 小莫
 * Date: 2019-01-18 18:11
 * Description:<描述>
 */
//不需要添加任何注解 ,springboot 将接口类会自动注解到spring容器中,只需要继承JpaRepository(这个接口默认会提供给我们一些基础的数据库操作)
//第一个参数 User:表示接口对应的实体类 ;第二个参数 Integer : 表示该实体类对应表主键的类型
public interface UserRepository extends JpaRepository<User,Integer> {

}
5.5、创建 Service
  • 首先创建一个 service 的接口
代码语言:javascript
复制
package com.xmlvhy.girl.service;
import com.xmlvhy.girl.entity.User;
import java.util.List;

/**
 * Author: 小莫
 * Date: 2019-01-18 18:26
 * Description:<描述>
 */
public interface UserService {

    //获取所有的用户信息
    List<User>findAllUsers();

    //保存用户信息,这个方法主要是为了后面演示一下,事务回滚
    void saveUsers();
}
  • 创建一个 service 的实现类
代码语言:javascript
复制
package com.xmlvhy.girl.service.impl;

import com.xmlvhy.girl.Dao.UserRepository;
import com.xmlvhy.girl.entity.User;
import com.xmlvhy.girl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Author: 小莫
 * Date: 2019-01-18 18:27
 * Description:<描述>
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public List<User> findAllUsers() {
        return userRepository.findAll();
    }

    @Override
    public void saveUsers() {
        User user1 = new User();
        user1.setAge(10);
        user1.setName("小红");
        userRepository.save(user1);

        User user2 = new User();
        user2.setAge(10);
        user2.setName("小明");
        userRepository.save(user2);
    }
}
5.6、创建一个 Controller 类

编写一个 获取 user 的信息和保存用户的接口:

代码语言:javascript
复制
package com.xmlvhy.girl.web;

import com.xmlvhy.girl.entity.User;
import com.xmlvhy.girl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Author: 小莫
 * Date: 2019-01-18 19:45
 * Description:<描述>
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     *功能描述: 获取所有用户
     * @Author 小莫
     * @Date 19:48 2019/01/18
     * @Param []
     * @return List<User>
     */
    @GetMapping("/get")
    public List<User> getUsers(){
        return userService.findAllUsers();
    }

    /**
     *功能描述: 保存两个用户的信息
     * @Author 小莫
     * @Date 19:48 2019/01/18
     * @Param []
     * @return void
     */
    @RequestMapping("/save")
    public void saveUsers(){
        userService.saveUsers();
    }
}
5.7、运行项目,测试

打开浏览器,地址栏中输入:http://localhost:8082/user/get ,结果如下:

表明成功返回获取的数据。

此时我们访问:http://localhost:8082/user/save, 这时候成功结果会将我们设定好的两个数据插入数据库中,访问如果没什么异常,这时候查看数据库:

表明数据也成功插入进入了。

六、数据库事务管理
  • 数据库的事务,比如同时插入两条数据,但是其中一条失败了,另一条我就不希望它插入了.希望的结果要么两个同时成功,要么都不成功(场景:如商家卖东西,客户扣款商家扣库存,要么操作都失败要么都成功!要不然会出事的~)
  • 一般情况下,只有查询的时候不加事务,其它任何操作都要加事务。springboot在Service类的方法前加上@Transactional 注解即可。也可以在每个方法上添加事务,会默认以方法上添加的事务为前提,如果没有就以service类上的注解为准
  • SpringBoot 2.x JPA 默认引擎为 myisam ,这个不支持事务回滚,会出现添加事务注解,但是无效的情况。此时在application.properties 中,需要将引擎修改为innodb,这个是支持事务回滚的!
代码语言:javascript
复制
#不加这句则默认为myisam引擎,该引擎不会事务回滚,添加如下:在application.properties 中可将引擎修改为 innodb
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

我们来模拟一个异常,在service中,修改一下 saveUsers 这个方法,通过是用事务和不使用事务来对比看一下:

代码语言:javascript
复制
 @Override
    public void saveUsers() {
        User user1 = new User();
        user1.setAge(10);
        user1.setName("小杰");
        userRepository.save(user1);

        //模拟一个异常
        int i = 10/0;

        User user2 = new User();
        user2.setAge(10);
        user2.setName("小明");
        userRepository.save(user2);
    }

此时,我们重新build项目,然后访问一下:http://localhost:8082/user/save ,会提示服务器内部错误,从报错可以看出是我们设定的场景!然后再去看一下数据库,看小杰 有没有保存进入数据库:

发现小杰的数据插入数据库了,小明的没有插入成功,因为小明的数据插入前出现我们设定的异常了

那么我们如何避免这种情况呢?我们希望的是要么两个都失败,要么都成功!这就需要事务管理了!修改如下:

代码语言:javascript
复制
	@Transactional
	@Override
    public void saveUsers() {
        User user1 = new User();
        user1.setAge(10);
        user1.setName("加事务还能保存吗");
        userRepository.save(user1);

        //模拟一个异常
        int i = 10/0;

        User user2 = new User();
        user2.setAge(10);
        user2.setName("小明");
        userRepository.save(user2);
    }

再次build项目,然后我们在访问保存用户的接口:http://localhost:8082/user/save ,你会发现,虽然还会报同样的异常,但是事务起作用了,也就是说,加事务还能保存吗 这条数据也不能保存到数据库中了。这就实现了事务的回滚!

以上便是SpringBoot 2.x 快速入门的所有内容,教你快速创建一个Web项目!

本内容涉及的代码:获取源码

另外,提供一套免费学习视频,这套课程原本在慕课网最受欢迎的一套 2 小时入门 SpringBoot,老师讲的不错,但是由于内容中影响不好,被慕课官方下架了,网友提供录制版本,蛮清晰的。仅供学习使用!

代码语言:javascript
复制
视频获取地址:https://pan.baidu.com/s/1Clpnwxacn2SIOh4w3_rSiA

本文作者: AI码真香

本文标题: SpringBoot 2.x 教你快速入门

本文网址: https://www.xmlvhy.com/article/62.html

版权说明: 自由转载-非商用-非衍生-保持署名 署名-非商业性使用4.0 国际 (CC BY-NC 4.0)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、SpringBoot 简介
    • 1.1、SpringBoot 是什么?
      • 1.2、为什么使用SpringBoot
      • 二、第一个SpringBoot应用
        • 2.1、简介
          • 2.2、步骤
          • 三、属性配置文件
            • 3.1、SpringBoot 配置文件默认有两种
              • 3.2、SpringBoot 配置文件中添加属性
                • 3.3、SpringBoot 多环境配置
                • 四、Controller的使用
                  • 4.1、简介
                    • 4.2、处理请求中的参数
                    • 五、操作数据库
                      • 5.1、POM.xml中添加相关依赖
                        • 5.2、新建一个实体类 User
                          • 5.3、添加数据库配置
                            • 5.4、创建一个 DAO 类
                              • 5.5、创建 Service
                                • 5.6、创建一个 Controller 类
                                  • 5.7、运行项目,测试
                                  • 六、数据库事务管理
                                  相关产品与服务
                                  数据库
                                  云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档