SpringBoot

目录

1. 什么是SpringBoot

2. SpringBoot特点 

3. 创建SpringBoot工程

4. SpringBoot配置文件 

5. profiles文件的介绍

6. SpringBoot注册web三大组件。

7. SpringBoot整合数据源 

8. SpringBoot整合mybatis

9. SpringBoot整合PageHelper分页插件

10. SpringBoot整合swagger2

swagger例子(增删改查)


1. 什么是SpringBoot

        springboot可以帮你简化spring的搭建,并且快速创建一个spring的应用程序。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置

2. SpringBoot特点 

(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。 

3. 创建SpringBoot工程

 

        可以选择版本号(最好选择低一点稳定的版本) 

 

4. SpringBoot配置文件 

        

有两种格式的配置文件:

第一种: properties属性文件

​
# 修改springboot中tomcat端口号.
server.port=8888

第二种: yml文件

server:
  port: 6666

不管是哪种,他们的名字必须以application开始。

如果两个配置文件同时存在,而且有些内容一样。按照properties的优先级高。如果有些不一样,两个配置文件不一样的会合并在一起。 

如何读取springboot配置文件的内容呢?

        (1)  @ConfigurationProperties该注解使用在类上。

通过@PropertiesConfiguration或者@Value注解。

实体类

@Component
@Data
@ConfigurationProperties("student")
public class Student {
    private String name;
    private int age;
    private String[] hobby;
    private Map<String,Object> map;
}

配置文件配置Student信息

student:
  name: "张三"
  age: 19
  hobby:
    - "唱"
    - "跳"
    - "rap"
  map :
    clazz: qy151
    id: 1001

controller类读取(自动配置)

@Autowired
private Student student;

@GetMapping("/index")
public Student index(){
    return student;
}

        (2) @Value注解。 只能放在我们的类属性上。而且它只能读取基本类型和字符串类型

配置文件
student:
  name: "张三"

读取

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

@GetMapping("/hello")
public String hello(){
    return name;
}

5. profiles文件的介绍

思考: 我们在实际开发中,环境有哪些?

开发环境---->测试环境---->线上环境 由于环境的不同,那么就会有不同的配置内容。

难道我们不断的修改配置内容。----不会

实际工作中,针对不同的环境配置不同的配置文件,然后再总的配置文件中激活相应的配置文件

其中application.yml 配置共同的信息,其他的配置各个环境独有的信息

当我们使用某个环境时就启动哪个

spring:
  profiles:
    active: dev

 

6. SpringBoot注册web三大组件。

什么是web的三个组件?

Servlet和Filter以及Linstener监听器。

为什么要注册这三个组件呢?

因为后面springboot有可能要集成第三方框架,而第三方框架的底层可能就依赖于过滤器或者servlet.

如何注册呢?

          

思考: 早期:

<1>Servlet类

<2>注册到Tomcat容器web.xml

<servlet>
    <servlet-name></servlet-name>
    <servlet-class>Servlet类</servlet-class>
</servlet>
<servlet-mapping>
     <servlet-name></servlet-name>
     </url-parterrn>/</url-parterrn>
</servlet-mapping>
​

现在:都没有web.xml

创建一个配置类:

@Configuration //该类为配置类 xml文件
public class MyConfig {
​
    @Bean  //理解为配置文件中<bean >
    public ServletRegistrationBean<Servlet> registrationBean(){
        //创建一个Servlet注册器.
         ServletRegistrationBean<Servlet> registrationBean=new ServletRegistrationBean<>();
         registrationBean.setName("my");
         registrationBean.setServlet(new MyServlet());
         registrationBean.addUrlMappings("/my");
         return registrationBean;
    }
​
}

以前如何注册过滤器: web.xml

​ <filter>

​ <filter-name></filter-name>

​ <filter-class></filter-class>

​ </filter>

​ <filter-mapping>

​ <filter-name></filter-name>

​ <url-partter></url-partter>

​ </filter-mapping>

现在:

 @Bean
    public FilterRegistrationBean<Filter> filterRegistrationBean(){
          FilterRegistrationBean<Filter> filterRegistrationBean=new FilterRegistrationBean<>();
          filterRegistrationBean.setName("myfilter");
          filterRegistrationBean.setFilter(new MyFilter());
          filterRegistrationBean.addUrlPatterns("/*");
          return filterRegistrationBean;
    }

7. SpringBoot整合数据源 

 

数据源: 指的是数据源。即是: springboot框架连接数据库。

(1)引入依赖

 <!--加入数据源的启动依赖: springboot启动时会加载对应的自动装配类。-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
​

(2)配置数据源信息---application.properties

# 配置数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root

(3)测试(在test下测试)

​
@SpringBootTest(classes = Springboot1Application.class)
class Springboot1Application{
​
​
    @Autowired
    private DataSource dataSource;
​
    @Test
    public void test01() throws SQLException {
        //验证了springboot可以帮你完成数据源的自动装配功能
        System.out.println(dataSource.getConnection());
    }
​
}

上面默认这个数据源使用的连接池Hikari。如果不想使用默认的连接池,我们可以引入第三方的连接池。

集成druid数据源

(1)依赖

 <!--引入数据库连接池druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>

(2)配置文件

spring.datasource.druid.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.username=root
spring.datasource.druid.password=root
#初始化的个数
spring.datasource.druid.initial-size=5
# 最大活跃数
spring.datasource.druid.max-active=10
# 最大等待时间
spring.datasource.druid.max-wait=3000
# 最小的闲置个数
spring.datasource.druid.min-idle=5

(3)测试

​
    @Autowired
    private DataSource dataSource;
​
    @Test
    public void test01() throws SQLException {
        //验证了springboot可以帮你完成数据源的自动装配功能
        System.out.println(dataSource);
        System.out.println(dataSource.getConnection());
    } 

8. SpringBoot整合mybatis

        

(1)引入mybatis启动依赖类

        <!--引入mybatis的启动依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
​

(2) 修改配置文件

#指定映射文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml

(3)再主启动类加上注解

@SpringBootApplication
@MapperScan(basePackages = "com.lcy.dao") //为指定的包下的接口生成代理实现类
public class Springboot1Application{
​
    public static void main(String[] args) {
        //加载那含有@SpringBootApplication注解的类,它的特殊之处就是该类使用了@SpringBootApplication ,它是一个复合组件。
        //@EnableAutoConfiguration
        SpringApplication.run(Springboot1Application.class, args);
    }
​
}

(4)测试 (自己写个entity类,dao层及其mapper)

    @Autowired
    private DeptMapper deptMapper;
​
    @Test
    void test02() {
        Student student = studentDao.selectById(2);
        System.out.println(student);
    }

9. SpringBoot整合PageHelper分页插件

(1)引入依赖

  <!--pageHelper的启动依赖 自动装配拦截器-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.2</version>
        </dependency>
​

(2)测试:

 @Test
 void test03() {
    PageHelper.startPage(1,3);
    List<Student> students = studentDao.selectALl();
    PageInfo<Student> pageInfo = new PageInfo<>(students);
    System.out.println("当前页:" + pageInfo.getPageNum());
 }

10. SpringBoot整合swagger2

什么是swagger2.

它是一个接口文档----用来前后端分离的一款文档。

(1)引入swagger依赖

​
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>1.9.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.7.8</version>
        </dependency>
​

(2)创建swagger配置类

package com.lcy.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.VendorExtension;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;

/**
 * @Author Lcy
 * @Date 2022/7/22
 */
@Configuration
public class SwaggerConfig {

    @Bean
    public Docket docket(){
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())//设置api文档信息
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.lcy.controller"))//指定为哪些包下的类生成接口文档。
                .build();
        return docket;
    }

//定义自己接口文档信息
    public ApiInfo apiInfo(){
        Contact DEFAULT_CONTACT = new Contact("lcy", "http://www.baidu.com", "111111111@qq.com");
        return new ApiInfo("中国文档", "中国最具权威性文档", "1.0",
                "http://www.jd.com", DEFAULT_CONTACT, "超英科技",
                "http://www.taobao.com",  new ArrayList<VendorExtension>());
    }
}

 

 

swagger注解介绍

@Api  接口类的注解---接口类上 tag属性
@ApiOperation  接口方法的注解---接口方法上 value:
@ApiImplicitParams( 接口参数的说明
    {
      ApiImplicitParam() //单个参数的说明
    }
)
​
@ApiModel---- 实体类接口注解
@ApiModelProperty---->实体类属性的说明

访问

第一种: http://localhost:8081/swagger-ui.html

第二种: http://localhost:8081/doc.html

swagger例子(增删改查)

application.yml
spring:
  profiles:
    active: dev

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai
    username: root
    password: root

server:
  servlet:
    context-path: /lcy

mybatis:
  mapper-locations: mapper/*.xml

  application-dev.yml

server:
  port: 8081

实体类

package com.lcy.entity;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

/**
 * @Author Lcy
 * @Date 2022/7/22
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@ApiModel
public class Fruit {
    @ApiModelProperty(value = "编号")
    private Integer id;
    @ApiModelProperty(value = "水果名")
    private String name;
    @ApiModelProperty(value = "价格")
    private double price;
    @ApiModelProperty(value = "数量")
    private int num;
}

Dao层 及其Mapper映射

package com.lcy.dao;

import com.lcy.entity.Fruit;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;


/**
 * @Author Lcy
 * @Date 2022/7/22
 */
@Mapper
public interface FruitDao {
    Fruit selectById(Integer id);

    List<Fruit> selectAll();

    int add(Fruit fruit);

    int update(Fruit fruit);

    int delById(Integer id);



}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lcy.dao.FruitDao">
    <insert id="add">
        insert into fruit(id,name,price,num) values (null, #{name},#{price},#{num})
    </insert>

    <update id="update">
        update fruit set name=#{name}, price = #{price}, num = #{num} where id = #{id}
    </update>

    <delete id="delById">
        delete from fruit where id = #{id}
    </delete>

    <select id="selectById" resultType="com.lcy.entity.Fruit">
        select * from fruit where id = #{id}
    </select>
    <select id="selectAll" resultType="com.lcy.entity.Fruit">
        select * from fruit
    </select>

</mapper>

Controller层

package com.lcy.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lcy.dao.FruitDao;
import com.lcy.entity.Fruit;
import com.lcy.util.CommonResult;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Author Lcy
 * @Date 2022/7/22
 */
@RestController
public class FruitController {

    @Autowired
    private FruitDao fruitDao;

    @GetMapping("selectById")
    @ApiOperation("查询指定水果")
    @ApiImplicitParam(name = "id" , value = "水果编号")
    public CommonResult selectById(Integer id){
        Fruit fruit = fruitDao.selectById(id);
        return new CommonResult(2000,"查询成功",fruit);
    }

    @GetMapping("selectAll")
    @ApiOperation("查询所有水果")
    @ApiImplicitParams({
            @ApiImplicitParam(name= "currentPage" , value = "当前页码"),
            @ApiImplicitParam(name= "pageNum" , value = "每页数量"),
    } )
    public CommonResult selectAll(Integer currentPage, Integer pageNum){
        PageHelper.startPage(currentPage, pageNum);
        List<Fruit> fruits = fruitDao.selectAll();
        PageInfo<Fruit> pageInfo = new PageInfo<>(fruits);
        return new CommonResult(2000,"查询成功",pageInfo.getList());
    }

    @GetMapping("add")
    @ApiOperation("添加水果")
    @ApiImplicitParams({
            @ApiImplicitParam(name= "name" , value = "水果名"),
            @ApiImplicitParam(name= "price" , value = "单价"),
            @ApiImplicitParam(name= "num" , value = "数量")
    } )
    public CommonResult delById(String name, Double price, Integer num){
        Fruit fruit = new Fruit(null, name, price, num);
        int i = fruitDao.add(fruit);
        if(i==1){
            return new CommonResult(2000,"添加成功",null);
        }
        return new CommonResult(5000,"添加失败",null);
    }

    @GetMapping("update")
    @ApiOperation("修改水果")
    public CommonResult update(Fruit fruit){
        int i = fruitDao.update(fruit);
        if(i==1){
            return new CommonResult(2000,"修改成功",null);
        }
        return new CommonResult(5000,"修改失败",null);
    }

    @GetMapping("delById")
    @ApiOperation("删除指定水果")
    @ApiImplicitParam(name = "id" , value = "水果编号")
    public CommonResult delById(Integer id){
        int i = fruitDao.delById(id);
        if(i==1){
            return new CommonResult(2000,"删除成功",null);
        }
        return new CommonResult(5000,"删除失败",null);
    }
}

返回结果CommonResult类

package com.lcy.util;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author Lcy
 * @Date 2022/6/18
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel
public class CommonResult {
    @ApiModelProperty(value = "状态码:2000-成功, 5000-失败")
    private int code;
    @ApiModelProperty(value = "响应信息")
    private String message;
    @ApiModelProperty(value = "响应数据")
    private Object data;
}

启动后:Swagger显示 (http://localhost:8081/lcy/doc.html)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱喝可乐的灵麟鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值