目录
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: 1001controller类读取(自动配置)
@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---->实体类属性的说明访问
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)